倘Behavior这么些泼妇可以于wcf通信流中之其余地点插上同一底下,再一句话来说话马路上之大婶也可以写wcf了

 

  

  终于我还要看了了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,什么人看谁入迷,上边说归正传,

  转眼wcf技术早已面世至极多年了,也在.net界混的风生水从,同时.net也是一个惊人封装的框架,作为在wcf食物链最顶端的我们所能做的任务已经略的不能重略了,

探望那一个大有趣的Behavior。

再一次总而言之话马路上之大婶吗能够写wcf了,好了,wcf最中央的定义我们放在前面逐步分析,上面我们来看看神奇之3单binding怎么着KO我们其实情况中之80%之政工场景。

 

 

同一: Behavior这些泼妇的决定

一:basicHttpBinding

   
在面前的稿子中,我也懂的认证了全部wcf通信流,而Behavior这些泼妇可以于wcf通信流中之其余地点插上同一底下,蛮狠无比,利用的好,让您及天堂,利用的无

  作为入门第一首,也即便不透谈谈basic中之信道栈中这多少个什么东西了,你仅仅需要精通有ABC多个要素,注意不是大姨巾哦,即便欲详细询问,可以观赏我往日的多如牛毛。在

吓,让您下地狱。。。上边为你省behavior到底有安能够注入的触发???先画个简图:图片 1

这边我哪怕不多说了,太简单的事物没意思,先押个例子简单感受了,你只是待精晓之是basic走的凡http协议便吓了,传输新闻吧soap。

面的希冀,大概就是是wcf的通信简图,所有藏蓝色字体都是Behavior注入的点,其中Client和瑟维斯(Service)(Service)端都得注入,假使按照效益分的语句,又可分成“操作级别”和

  1. 契约

    1 using System.Runtime.Serialization;
    2 using System.ServiceModel;
    3
    4 namespace MyService
    5 {
    6 [ServiceContract]
    7 public interface IHomeService
    8 {
    9 [OperationContract]
    10 int GetLength(string name);
    11 }
    12 }

  2. 实现类

    1 using System;
    2 using System.Messaging;
    3 using System.Threading;
    4
    5 namespace MyService
    6 {
    7 public class HomeService : IHomeService
    8 {
    9 public int GetLength(string name)
    10 {
    11 return name.Length;
    12 }
    13 }
    14 }

  3. 劳动启动

    1 using System;
    2 using System.ServiceModel;
    3
    4 namespace MyService
    5 {
    6 class Program
    7 {
    8 static void Main(string[] args)
    9 {
    10 using (Service(Service)Host host = new ServiceHost(typeof(Home瑟维斯(Service))))
    11 {
    12 try
    13 {
    14 host.Open();
    15
    16 Console.WriteLine(“服务展!”);
    17
    18 Console.Read();
    19 }
    20 catch (Exception e)
    21 {
    22 Console.WriteLine(e.Message);
    23 }
    24 }
    25 }
    26 }
    27 }

  4. 配置config文件




























  5. 然后经 servicehost 启动服务端

    using System;
    using System.ServiceModel;

    namespace MyService
    {

     class Program
     {
         static void Main(string[] args)
         {
             using (ServiceHost host = new ServiceHost(typeof(HomeService)))
             {
                 try
                 {
                     host.Open();
    
                     Console.WriteLine("服务开启!");
    
                     Console.Read();
                 }
                 catch (Exception e)
                 {
                     Console.WriteLine(e.Message);
                 }
             }
         }
     }
    

    }

”端点级别“,上边我来概括的分解下。

图片 2

 

 

亚:端点级别Behavior

好了,到前日截至,服务端全部开了,接下我们因而“添加服务引用”,来补充加对客户端的援

  从图被你吗得以看来,信息检查器是坐落Channel这些级其它,也就是说它可监视Client和Server的入站请求,也就是说有的请都急需经过它转发,假设

 1 using System;
 2 
 3 namespace ConsoleApplication1
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             HomeServiceReference.HomeServiceClient client = new HomeServiceReference.HomeServiceClient();
10 
11             var s = client.GetLength("12345");
12 
13             Console.WriteLine("长度为:{0}", s);
14 
15             Console.Read();
16         }
17     }
18 }

这样的话,这自己是免是可在这多少个注入点上随便之修改,变更,拦截入站和出站请求,而且采纳这特性我还得做过多的事务,比如日志记录,记录总括等等,下

图片 3

对大家来探这怎么使用??? 只需要extends IEndpointBehavior
 和 IDispatchMessageInspector,然后在EndpointBehaviors即可。。。

 

 1. IDispatchMessageInspector

麻蛋,就如此简单,是的,就这样概括的五步,基于http的通信就这么让无小心的姣好了,真欠好意思。

 1     public class MyDispatchMessageInspector : IDispatchMessageInspector
 2     {
 3         public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
 4         {
 5             Console.WriteLine(request.ToString());
 6             return request;
 7         }
 8 
 9         public void BeforeSendReply(ref Message reply, object correlationState)
10         {
11             Console.WriteLine(reply.ToString());
12         }
13     }

 

2. IEndpointBehavior

二:netTcpBinding

 1     public class MyEndpointBehavior : IEndpointBehavior
 2     {
 3         public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
 4         {
 5         }
 6 
 7         public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
 8         {
 9         }
10 
11         public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
12         {
13             endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyDispatchMessageInspector());
14         }
15 
16         public void Validate(ServiceEndpoint endpoint)
17         {
18         }
19     }

  有矣basic的代码,现在我们而反成为tcp通信,这会通信走之是字节流,很简单,改一下劳动端的config文件就吓了,我们呢懂那种性质要比basic好。

3.
将MyEndpointBehavior加入到Host中

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mxbehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service name="MyService.HomeService" behaviorConfiguration="mxbehavior">
        <endpoint address="net.tcp://localhost:19200/HomeService" binding="netTcpBinding" contract="MyService.IHomeService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1920/HomeService"/>
          </baseAddresses>
        </host>
      </service>
    </services>

  </system.serviceModel>
</configuration>
 1   static void Main(string[] args)
 2         {
 3             ServiceHost host = new ServiceHost(typeof(HomeService), new Uri("http://127.0.0.1:1920"));
 4 
 5             host.AddServiceEndpoint(typeof(IHomeService), new BasicHttpBinding(), "HomeServie");
 6 
 7             host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });
 8 
 9             host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
10 
11             host.Description.Endpoints[0].EndpointBehaviors.Add(new MyEndpointBehavior());
12 
13             host.Open();
14 
15             Console.WriteLine("服务已经开启!!!");
16 
17             Console.Read();
18         }

 

  1. 说到底大家看一下劳务形式

    1 public class HomeService : IHomeService
    2 {
    3 public string Update(string message)
    4 {
    5 Console.WriteLine(“我在Action方法:” + message);
    6
    7 return “my reply!!!”;
    8 }
    9 }

三:netMsmqBinding

 

  msmq这多少个东西,我眷恋我们都清楚,一个大体上的文件,好处呢,你也了然,就是client和service的装有通信都设透过她的手,这样任何一方出了问题,只要

脚看看效果。。。在效率图被,你应该看到了。在自的Action中的措施前后各有相同段子“入站音讯”和“出站音信”,是无是这个爽朗???

它于就从未问题了。同样大家管tcp改成为msmq也是非凡简单的,可是假设顾,msmqbinding中凡是无可以让契约方法有再次回到值的。所以我们添加isoneway就好了。

图片 4

using System.Runtime.Serialization;
using System.ServiceModel;

namespace MyService
{
    [ServiceContract]
    public interface IHomeService
    {
        [OperationContract(IsOneWay = true)]
        void GetLength(string name);
    }
}

 

接下来自己于mmc上新建一个信息队列,如下:

其三:操作级别Behavior

图片 5

  从随笔起头的简图中,你该看到了,Operation级其余Behavior相比多,有“操作启动器(IOperationInvoker)”,”参数检查(IParameterInspector)“,

下一场我们再变更以下配置文件

“音信格式化器(IDispatchMessageFormatter)”等等。。。
为什么说等等这词,很简单啊,,,其实还有好多类别放的,既然是Operation,这便必

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mxbehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <netMsmqBinding>
        <binding name="msmqbinding">
          <security mode="None"/>
        </binding>
      </netMsmqBinding>
    </bindings>
    <services>
      <service name="MyService.HomeService" behaviorConfiguration="mxbehavior">
        <endpoint address="net.msmq://localhost/private/homequeue" binding="netMsmqBinding"
                  contract="MyService.IHomeService" bindingConfiguration="msmqbinding">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:19200/HomeService"/>
          </baseAddresses>
        </host>
      </service>
    </services>

  </system.serviceModel>
</configuration>

然是本着方法的,还记得OperationContract是怎学在方及之啊???
是特点,对吧,,,同样的理,OperationBehavior也是一律,这怎么用吧??

图片 6

平为是杀粗略的,继承几单接口即可。。。

 

 <1> IParameterInspector
的玩法

综观下面的老三栽binding,配置起何等简单,底层的各种通讯协议貌似对自吧都是晶莹底,其实也???wcf在底层做了何其多的事体,而自我可从没挖掘。。。

 
 其实没什么好说的,既然是属于Operation下边的Behavior,这都是经特色注入的,而者IParameterInspector,可以形成类似Mvc的Model验证,下面

即对码农里说乎是同一种植悲伤啊。。。出了问题便不得不祈祷上龙。。。下一篇我会先河深入剖析。

我做个简单的Action参数长度验证(长度不超越8单字符)。

 

1. IParameterInspector

 1     public class MyIParameterInspector : IParameterInspector
 2     {
 3         public int MaxLength { get; set; }
 4 
 5         public MyIParameterInspector(int MaxLength)
 6         {
 7             this.MaxLength = MaxLength;
 8         }
 9 
10         /// <summary>
11         /// 出站的操作
12         /// </summary>
13         /// <param name="operationName"></param>
14         /// <param name="outputs"></param>
15         /// <param name="returnValue"></param>
16         /// <param name="correlationState"></param>
17         public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
18         {
19 
20         }
21 
22         /// <summary>
23         /// 入站的参数
24         /// </summary>
25         /// <param name="operationName"></param>
26         /// <param name="inputs"></param>
27         /// <returns></returns>
28         public object BeforeCall(string operationName, object[] inputs)
29         {
30             foreach (var item in inputs)
31             {
32                 if (Convert.ToString(item).Length > MaxLength)
33                 {
34                     throw new Exception("码单,长度不能超过 " + MaxLength + " 个长度");
35                 }
36             }
37 
38             return null;
39         }
40     }

2. IOperationBehavior

 1 public class MyOperationBehavior : Attribute, IOperationBehavior
 2     {
 3         public int MaxLength { get; set; }
 4 
 5         public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
 6         {
 7 
 8         }
 9 
10         public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
11         {
12 
13         }
14 
15         public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
16         {
17             dispatchOperation.ParameterInspectors.Add(new MyIParameterInspector(MaxLength));
18         }
19 
20         public void Validate(OperationDescription operationDescription)
21         {
22 
23         }
24     }
  1. 在Action在加上MyOperationBehavior 这个
    Attribute

    1 public class HomeService : IHomeService
    2 {
    3 [MyOperationBehavior(MaxLength = 5)]
    4 public string Update(string message)
    5 {
    6 Console.WriteLine(“我在Action方法:” + message);
    7
    8 return “my reply!!!”;
    9 }
    10 }

4.
然后我以客户端故意输入大于5底字符,看看效果怎么着???

 1    public class Program1
 2     {
 3         static void Main(string[] args)
 4         {
 5             HomeServiceClient client = new HomeServiceClient();
 6 
 7             client.Update("我故意输入了很多的字符,哈哈。。。。。");
 8 
 9             Console.Read();
10         }
11     }

5.
最后看看效果图,可以看来,最后的入站信息会抛来一个怪。。。

 图片 7

 

<2> MessageFormatter,IOperationInvoker 的玩法

  
剩下的立时有限只玩法还差不多,你唯有需要extends一下,然后参加到OperationBehavior即可,有了地点的思,我惦记上面这些用起来还不是题材吧。。。

 

相关文章