程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 一個簡單的WCF RESTFul服務

一個簡單的WCF RESTFul服務

編輯:關於.NET

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

將在浏覽器中直接看到圖片。

大功告成!

歡迎 拍磚,大家一起討論,共同進步。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved