一个简单的WCF RESTFul服务

转自:http://www.cnblogs.com/chinajuanbob/archive/2009/05/08/1452627.html

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 @ 2011-12-03 19:10  therockthe  阅读(291)  评论(0)    收藏  举报