构建WCF RESTful service示例

83467014 2012-07-27

天来分享一下如何建立一个关于建立WCF RESTful service的示例, REST(Representational State Transfer)是一种轻量级的Web Service架构,操作比传统的基于Operation操作的WCF service和Web service更为简洁实用,可以完全通过HTTP协议实现,还可以通过缓存来提高相应速度,性能效率和易用性上都要优于SOAP协议,所以比较推荐使用RESTful service取代SOAP service。
REST架构遵循了CRUD原则,即四种行为:Create, Read, Update, Delete. 通过这四种行为完成一般的操作和处理,并且可以通过结合这些操作完成复杂的service结构。REST架构让我们可以更加深入的了解HTTP协议, 针对于协议的编程,更有利于开发出伸缩性强的应用。

REST将网络上的所有事物都抽象为资源,并通过连接器接口对资源进行CRUD的操作。

好,闲话少说,通过一个例子来说明RESTful service的构建和调用方式。

这个例子是关于图片的一个例子,说明我们怎样通过service来上传图片,和浏览图片,并且通过service将我们的local资源可以上载的网络中,节省空间。当然根据你的需要,可以把代码改变为自己的应用程序的逻辑代码。

为了证明这个service的可用性 我们需要建立两个project来完成这个项目,一个为Server,另一个为Client,Client端负责通过service与Service端交互,所以service应该部署在Server端的Web application中。

[本示例完整源码下载]

具体下载目录在 /2012年资料/7月/27日/构建WCF RESTful service示例/

创建PictureRESTService.cs类 并且通过下载Web API来创建这个service, 这里的Web API是微软开发的一套帮助我们创建和使用RESTful service的工具,大家可以在这里下载,并且引用在项目中,注意这些API有相互引用的地方所以建议大家在引用时候全部加入引用。

[最新的版本 WCF Web API Preview 5] http://wcf.codeplex.com/releases/view/73399

引用例子: using Microsoft.ApplicationServer.Http;

PictureRESTService.cs

  1. namespace CSWCFPhotoRatingSystem  
  2. {  
  3.     /// <summary>   
  4.     /// The RESTful web service that used to handle image basic functions.   
  5.     /// </summary>   
  6.     [ServiceContract]  
  7.     [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]  
  8.     [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, Namespace="PictureService")]  
  9.     public class PictureRESTService  
  10.     {  
  11.         /// <summary>   
  12.         /// Images search service.   
  13.         /// </summary>   
  14.         /// <param name="image"></param>   
  15.         /// <returns></returns>   
  16.         [WebGet(UriTemplate="/{image}")]  
  17.         public HttpResponseMessage GetImages(string image)  
  18.         {  
  19.             var response = new HttpResponseMessage();  
  20.             Stream memory = new MemoryStream();  
  21.             memory = GetImageByName(image);  
  22.             memory.Position = 0;  
  23.             response.Content = new StreamContent(memory);  
  24.             response.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");  
  25.             return response;  
  26.         }  
  27.   
  28.         /// <summary>   
  29.         /// Image adding service.   
  30.         /// </summary>   
  31.         /// <param name="message"></param>   
  32.         /// <param name="image"></param>   
  33.         [WebInvoke(UriTemplate = "/{image}", Method = "POST")]  
  34.         public void AddImages(HttpRequestMessage message,string image)  
  35.         {  
  36.             var directory = System.Web.HttpContext.Current.Server.MapPath("~/Images");  
  37.             var file = Path.Combine(directory, image);  
  38.             Stream stream = message.Content.ContentReadStream;  
  39.             FileStream fileStream = File.Create(System.Web.HttpContext.Current.Server.MapPath("~/Image/") + image);  
  40.             stream.CopyTo(fileStream);  
  41.             stream.Close();  
  42.             fileStream.Close();  
  43.             this.XmlFileAppend(image, System.Web.HttpContext.Current.Server.MapPath("~/Image/") + image);  
  44.         }  
  45.   
  46.         /// <summary>   
  47.         /// Images information searching service.   
  48.         /// </summary>   
  49.         /// <returns></returns>   
  50.         [WebGet(UriTemplate="",ResponseFormat=WebMessageFormat.Json)]  
  51.         public List<string> GetImageList()  
  52.         {  
  53.             List<string> list = this.GetAllImages();  
  54.             if (list != null && list.Count != 0)  
  55.             {  
  56.                 return list;  
  57.             }  
  58.             else  
  59.             {  
  60.                 return null;  
  61.             }  
  62.         }  
  63.   
  64.         /// <summary>   
  65.         /// Get specify image by image's Name property.   
  66.         /// </summary>   
  67.         /// <param name="image"></param>   
  68.         /// <returns></returns>   
  69.         public Stream GetImageByName(string image)  
  70.         {  
  71.             XDocument document = XDocument.Load(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Photo.xml"));  
  72.             var nodeList = from node in document.Descendants("Image")  
  73.                            where node.Attribute("open").Value.ToString().Equals("1")  
  74.                            select node;  
  75.             foreach (var node in nodeList)  
  76.             {  
  77.                 if (node.Element("Name").Value.Equals(image))  
  78.                 {  
  79.                     FileStream fileStream = null;  
  80.                     string physicUrl = node.Element("PhysicsUrl").Value;  
  81.                     fileStream = File.Open(physicUrl, FileMode.Open);  
  82.                     MemoryStream ms = new MemoryStream();  
  83.                     fileStream.CopyTo(ms);  
  84.                     return ms;      
  85.                 }  
  86.             }  
  87.             return null;  
  88.         }  
  89.   
  90.         /// <summary>   
  91.         /// Get all images' physics url string variable.   
  92.         /// </summary>   
  93.         /// <returns></returns>   
  94.         public List<string> GetAllImages()  
  95.         {  
  96.             List<string> list = new List<string>();  
  97.             XDocument document = XDocument.Load(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Photo.xml"));  
  98.             var nodeList = from node in document.Descendants("Image")  
  99.                            where node.Attribute("open").Value.ToString().Equals("1")  
  100.                            select node;  
  101.             foreach (var node in nodeList)  
  102.             {  
  103.                 list.Add(node.Element("PhysicsUrl").Value);  
  104.             }  
  105.             return list;  
  106.         }  
  107.   
  108.         /// <summary>   
  109.         /// Add XElement to xml file to record new images.   
  110.         /// </summary>   
  111.         /// <param name="fileName"></param>   
  112.         /// <param name="physicsUrl"></param>   
  113.         protected void XmlFileAppend(string fileName, string physicsUrl)  
  114.         {  
  115.             string xmlPath = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Photo.xml");  
  116.             XDocument document = XDocument.Load(xmlPath);  
  117.             XElement element = new XElement("Image"new XElement("Name", fileName), new XElement("PhysicsUrl", physicsUrl));  
  118.             element.Add(new XAttribute("open""1"));  
  119.             document.Element("Root").Add(element);  
  120.             document.Save(xmlPath);  
  121.         }  
  122.     }  

相关推荐