WCF的REST實例網上很多,這裡是我這幾天學習並實踐通過的,算是個筆記吧 。
1、服務契約
[ServiceContract]public interface IRESTService{}
具體操作定義中,有如下幾個參數要注意:
1、WebGet和WebInvoke的區別好像就是Method的定義不同,WebGet使用 "GET",WebInvoke則更靈活。
2、UriTemplate用{value}對應 參數列表。
3、WebMessageFormat包括XML和JSON,網上有篇實現RAW的文 章,還沒仔細研究。
所謂簡 單的例子嘛,就自定義一個返回對象的
1 [OperationContract]
2 [WebGet(UriTemplate = "{name}?token={token}", ResponseFormat = WebMessageFormat.Json)]
3 Person GetPerson(string name, string token);
和一個 返回圖片的
1 [OperationContract]
2 [WebGet(UriTemplate = "Data/{id}?token={token}")]
3 Stream GetData(string id, string token);
注意定義中 的變量類型為string,另外token是想以後做個簡單的認證用的,還沒有想清楚, 不在本次討論范疇內。
2、宿主
直接用WebServiceHost最好,
WebServiceHost restHost = new WebServiceHost(typeof (RESTService),new Uri ("http://localhost/RestService"));
用ServiceHost 麻煩一些,不過更靈活。
1 ServiceHost GetRestHost(Uri baseAddress)
2 {
3 ServiceHost host = new ServiceHost(typeof (RESTService), baseAddress);
4 WebHttpBinding binding = new WebHttpBinding();
5 ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IRESTService), binding, baseAddress);
6 WebHttpBehavior httpBehavior = new WebHttpBehavior();
7 endpoint.Behaviors.Add(httpBehavior);
8 return host;
9 }
3、具體操作實例
3.0 先定義一個簡單的數據契約
1 [DataContract]
2 public class Person
3 {
4 [DataMember]public string Name{get;set;}
5 [DataMember]public DateTime Birthday{get;set;}
6 }
留了個DateTime類型的數據,准備以後研究客戶端的時候用 ,不是都說js下處理json日期和WCF不一樣麼。
3.1 返回字串的例子 (JSON)
1 public Person GetPerson(string name, string token)
2 {
3 return new Person {Name=name,Birthday=DateTime.Now};
4 }
這樣訪問如下地址
http://localhost/RestService/Tom?token=123
將得到這樣的結 果:
1 {
2 Birthday: "/Date(1241764517437+0800)/"
3 Name: "Tom"
4 }
推薦安裝Firefox的jsonview插件查看結果。
3.2 返 回二進制的例子(圖片)
1 public Stream GetData(string id, string token)
2 {
3 WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
4 MemoryStream ms = new MemoryStream();
5 try
6 {
7 Bitmap bmp = new Bitmap (@"E:\1.jpg");
8 bmp.Save(ms, bmp.RawFormat);
9 ms.Position=0;
10 bmp.Dispose();
11 return ms;
12 }
13 catch(Exception e)
14 {
15 Console.WriteLine(e.ToString());
16 return null;
17 }
18 }
這裡就簡單用讀取文件裡,實際中打算用數據庫。
1 、這塊再多說兩句,一個是Stream釋放資源的問題,還沒有搞清楚平台是不是自 己會在交互後Dispose或者Close掉。
2、另一個就是用byte[]做返回值類 型的方法沒有調通,返回的數據是Base64編碼的數據,並且帶XML標識。
3 、還要注意ContentType的賦值,其他非文本類型應該類似,還沒有實際驗證。
4、大文件傳輸的時候可以修改Binding的 MaxReceivedMessageSize, ReaderQuotas.MaxStringContentLength,SendTimeout和 ReceiveTimeout解決數 據過大和超時問題,不過我總感覺用WCF傳個10MB以內的還過得去,太大了就怪怪 的了。
好了,現在訪問
http://localhost:800/RestService/Data/100? token=200
將在浏覽器中直接看到圖片。
大功告成!
歡迎 拍磚,大家一起討論,共同進步。