[实践]一个简单的WCF RESTFul服务
WCF的REST实例网上很多,这里是我这几天学习并实践通过的,算是个笔记吧。
1、服务契约
具体操作定义中,有如下几个参数要注意:
1、WebGet和WebInvoke的区别好像就是Method的定义不同,WebGet使用"GET",WebInvoke则更灵活。
2、UriTemplate用{value}对应参数列表。
3、WebMessageFormat包括XML和JSON,网上有篇实现RAW的文章,还没仔细研究。
所谓简单的例子嘛,就自定义一个返回对象的
2 [WebGet(UriTemplate = "{name}?token={token}", ResponseFormat = WebMessageFormat.Json)]
3 Person GetPerson(string name, string token);
和一个返回图片的
2 [WebGet(UriTemplate = "Data/{id}?token={token}")]
3 Stream GetData(string id, string token);
注意定义中的变量类型为string,另外token是想以后做个简单的认证用的,还没有想清楚,不在本次讨论范畴内。
2、宿主
直接用WebServiceHost最好,
用ServiceHost麻烦一些,不过更灵活。
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 先定义一个简单的数据契约
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)
2 {
3 return new Person{Name=name,Birthday=DateTime.Now};
4 }
这样访问如下地址
将得到这样的结果:
2 Birthday: "/Date(1241764517437+0800)/"
3 Name: "Tom"
4 }
推荐安装Firefox的jsonview插件查看结果。
3.2 返回二进制的例子(图片)
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以内的还过得去,太大了就怪怪的了。
好了,现在访问
将在浏览器中直接看到图片。
大功告成!
欢迎拍砖,大家一起讨论,共同进步。
转载请注明出处,有帮助请回帖支持一下:)