ITPub博客

首页 > IT职业 > IT职场 > 用WCF来玩Rest

用WCF来玩Rest

IT职场 作者:wjaning 时间:2021-09-09 09:42:03 0 删除 编辑

  

        在我们玩wcf的时候,都会潜意识的觉得wcf就是通过soap协议交换消息的,并且可以在basic,tcp,msmq等等绑定中任意切换,

牛逼的一塌糊涂,但是呢,如果说哪一天wcf不再使用soap协议,而是采用json格式的字符串,是不是有一点颠覆你对wcf的认识的???

从传统意义上说,wcf是非常重量级的,很明白的一个例子就是太多太多的配置,尤其是Behavior的配置,而且behavior对wcf来说又是重

中之重,它对wcf的扩展和性能又是最重要的,可恨的是wcf在binding,behavior,contract之中的配置又是非常非常的保守,可以说用

wcf来玩分布式,这些默认配置是完全做不到的,就比如说basicbinding的基类HttpBindingBase。

图片描述

 

抱怨的话我也不说了,可能微软也觉得这个问题是个不小的问题,然后就有了轻量级的 asp.net web api,你可以看到它和wcf比起来精

简多了,也许让我们这些码农更加的专注于业务吧,既然wcf带了这玩意,我也得必须约谈一下。

 

一:UriTemplate

  要说rest,还得先说UriTemplate,因为wcf用UriTemplate来做rest中的uri模板匹配,然后用WebInvoke这个OperationBehavior

插入到wcf的心脏中,说的玄乎一点,这个就有点像mvc中的路由匹配机制,下面我举个例子:

 

1. 用UriTemplate来告知可以监视的完整Url

  从下面的图中,可以看到三个元素:服务地址,模板,入参(这里面的”1“),这三个元素组合在一起,就构成了完整的remote url,

然后这个完整的url就是我模板(/User/{id})监视的对象。


 

2. 通过UriTemplate来解析url中的参数。

  既然可以构建url,那当然可以解析url啦,对吧,下面这张图可以很清晰的告知你,当外来的url=http://127.0.1:1920/HomeService

/User/1过来的时候应该被哪个uriTemplate所接收。

图片描述

 

正是因为UriTemplate具有这样的url构建和解析能力,所以wcf就把UriTemplate作为WebInvoke和WebGet这两个属性的参数来动态

解析外来的url,然后根据这个url分配到具体的服务方法上,下面我们具体看一看。

 

二:WebGet,WebInvoke的使用

  刚才也说了,WebGet和WebInvoke正是用了UriTemplate,才具有了路由转向的功能,还有就是默认返回的是xml,这里就用json

值作为服务返回的格式

图片描述

 1     [ServiceContract] 2     public interface IHomeService 3     { 4         [OperationContract] 5         [WebGet(UriTemplate = "Get/{id}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 6         Student Get(string id); 7  8         [OperationContract] 9         [WebInvoke(Method = "POST", UriTemplate = "Add", RequestFormat = WebMessageFormat.Json,10                    ResponseFormat = WebMessageFormat.Json)]11         string Add(Student stu);12     }

图片描述

对了,Rest推荐使用Http协议中的Get,Post,Delete,Put来作为CURD的状态机制,然后就是你如果看懂了UriTemplate,那你现在应

该知道这个Template在监视什么类型的url。做完了上面的coding,下面我们需要在webconfig中通过behavior来指定启动“web编程模型”,

就比如下面这样。

图片描述

 1  2  3  4    5      6        7          8            9         10       11       12         13           14         15       16     17     18   19 20   21 22     23       24     25 26     27       28         29           30           31         32       33       34         35           36         37       38     39 40     41       42         44           45             46           47         48         49         50           51             52           53         54       55     56 57   58 59 

图片描述

 

其实呢?也就是代码中的WebHttpBehavior类

图片描述

 

好了,我现在服务地址也出来了:http://127.0.0.1:1920 ,然后服务方法的template也指定了。只要http.sys监控到了template

匹配的url,服务方法就会被执行,比如我现在在浏览器里面输入:http://127.0.0.1:1920/HomeService/Get/1  来测试下Get操作。

图片描述

可以看到,get方法成功了,也正确的匹配了我的服务方法Get。

图片描述

 1     public class HomeService : IHomeService 2     { 3         public Student Get(string id) 4         { 5             return new Student() { ID = Convert.ToInt32(id), Name = "hxc", SNS = "001" }; 6         } 7  8         public string Add(Student stu) 9         {10             return "hello";11         }12     }

图片描述

 

然后我们看看Add方法,我在HttpWebRequest中模拟测试如下。

 1    class Program 2     { 3         static void Main(string[] args) 4         { 5             Run(); 6         } 7  8  9         ///  10         /// 报告系统错误 11         ///  12         ///  13         ///  14         public static void Run()15         {16             HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://127.0.0.1:1920/HomeService/Add");17             Encoding encoding = Encoding.UTF8;18 19             string param = new JavaScriptSerializer().Serialize(new { ID = "10", Name = "hxc", SNS = "001" });20             byte[] bs = Encoding.ASCII.GetBytes(param);21 22             string responseData = String.Empty;23             req.Method = "POST";24             req.ContentType = "application/json";25             req.ContentLength = bs.Length;26             using (Stream reqStream = req.GetRequestStream())27             {28                 reqStream.Write(bs, 0, bs.Length);29                 reqStream.Close();30             }31             using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())32             {33                 using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))34                 {35                     responseData = reader.ReadToEnd().ToString();36                 }37             }38         }39     }

View Code

 

图片描述

 

好了,大概就说这么多了,如果说你不嫌麻烦,你可以用WCF Rest,还有就是不要忘了很多的默认配置,如果你觉得太繁琐,

可以用用asp.net web api。

图片描述

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2983/viewspace-2806241/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-06

  • 博文量
    73
  • 访问量
    6473