[实践]一个简单的WCF RESTFul服务

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/RestService/Data/100?token=200

将在浏览器中直接看到图片。

大功告成!

 

欢迎拍砖,大家一起讨论,共同进步。

转载请注明出处,有帮助请回帖支持一下:)

posted @ 2009-05-08 15:46  chinajuanbob  阅读(3387)  评论(4编辑  收藏  举报