在大家玩wcf的时候,都会下意识的认为wcf正是通过soap协议交流新闻的,并且能够在basic,tcp,msmq等等绑定中肆意切换,

牛逼的一无可取,不过呢,假使说什么日期wcf不再利用soap协议,而是采用json格式的字符串,是或不是有一些天翻地覆你对wcf的认识的???

从守旧意义上说,wcf是卓殊重量级的,很领悟的3个例证正是太多太多的配置,尤其是Behavior的配备,而且behavior对wcf来说又是重

中之重,它对wcf的扩展和性质又是最根本的,可恨的是wcf在binding,behavior,contract之中的陈设又是这么些可怜的墨守成规,能够说用

wcf来玩分布式,那个暗许配置是截然做不到的,就比如说basicbinding的基类HttpBindingBase。

json 1

 

抱怨的话小编也不说了,大概微软也以为那一个难点是个相当大的难点,然后就有了轻量级的
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})监视的靶子。

json 2

 

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

  既然可以营造url,这自然能够解析url啦,对啊,上边那张图可以很清晰的告诉您,当外来的url=http://127.0.1:1920/HomeService

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

json 3

 

幸亏因为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来作为CU宝马7系D的意况机制,然后正是你一旦看懂了UriTemplate,那你未来应

该知情那么些Template在监视什么项目标url。做完了上面包车型客车coding,上边大家须求在webconfig中经过behavior来钦定运维“web编制程序模型”,

就比如上面那样。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3 
 4   <system.diagnostics>
 5     <sources>
 6       <source name="System.ServiceModel" switchValue="ActivityTracing">
 7         <listeners>
 8           <add name="mylisteners" type="System.Diagnostics.XmlWriterTraceListener" initializeData="E:\1.txt" />
 9         </listeners>
10       </source>
11       <source name="System.ServiceModel.MessageLogging" switchValue="ActivityTracing">
12         <listeners>
13           <add name="messagelogging" type="System.Diagnostics.XmlWriterTraceListener" initializeData="E:\2.txt"/>
14         </listeners>
15       </source>
16     </sources>
17     <trace autoflush="true"/>
18   </system.diagnostics>
19 
20   <system.serviceModel>
21 
22     <diagnostics>
23       <messageLogging logEntireMessage="true" logMalformedMessages="true"  logMessagesAtTransportLevel="true" />
24     </diagnostics>
25 
26     <behaviors>
27       <serviceBehaviors>
28         <behavior>
29           <serviceMetadata httpGetEnabled="true" />
30           <serviceDebug includeExceptionDetailInFaults="true" />
31         </behavior>
32       </serviceBehaviors>
33       <endpointBehaviors>
34         <behavior name="webbehavior">
35           <webHttp />
36         </behavior>
37       </endpointBehaviors>
38     </behaviors>
39 
40     <services>
41       <service name="MyService.HomeService">
42         <endpoint address="HomeService" binding="webHttpBinding" behaviorConfiguration="webbehavior"
43           contract="MyService.IHomeService">
44           <identity>
45             <dns value="localhost" />
46           </identity>
47         </endpoint>
48         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
49         <host>
50           <baseAddresses>
51             <add baseAddress="http://127.0.0.1:1920" />
52           </baseAddresses>
53         </host>
54       </service>
55     </services>
56 
57   </system.serviceModel>
58 
59 </configuration>

 

事实上呢?也等于代码中的WebHttpBehavior类

json 4

 

好了,作者现在劳动地点也出来了:http://127.0.0.1:1920
,然后服务措施的template也钦点了。只要http.sys监察和控制到了template

同盟的url,服务方法就会被实践,比如自身前几天在浏览器里面输入:http://127.0.0.1:1920/HomeService/Get/1
 来测试下Get操作。

json 5

能够见到,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中效仿测试如下。

json 6json 7

 1    class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Run();
 6         }
 7 
 8 
 9         /// <summary> 
10         /// 报告系统错误 
11         /// </summary> 
12         /// <param name="ex"></param> 
13         /// <returns></returns> 
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

 

json 8

 

好了,大约就说那样多了,假设说你不嫌麻烦,你能够用WCF
Rest,还有正是毫无忘了诸多的默许配置,假诺你觉得太繁琐,

能够用用asp.net web api。

json 9

 

相关文章

网站地图xml地图