WCF回调 *** 作以及应用技巧讲解

WCF回调 *** 作以及应用技巧讲解,第1张

概述WCF 开发插件 对于开发人员来说是一个比较重要的应用工具,可以帮助我们轻松的实现一些特定的功能需求。在这里我们就一起来分享一下有关WCF回调 *** 作的相关 *** 作技巧。 WCF回调 *** 作简单的说就是由服务端来调用客户端的方法,回调时原先的服务端和客户端将发生对调,服务端成为客户端,客户端成为服务端。 WCF服务消息正确查看方式探讨 保护WCF服务具体 *** 作步骤剖析 Silverlight消耗WCF服务实现步

WCF 开发插件 对于开发人员来说是一个比较重要的应用工具,可以帮助我们轻松的实现一些特定的功能需求。在这里我们就一起来分享一下有关WCF回调 *** 作的相关 *** 作技巧。 WCF回调 *** 作简单的说就是由服务端来调用客户端的方法,回调时原先的服务端和客户端将发生对调,服务端成为客户端,客户端成为服务端。

@H_404_10@WCF服务消息正确查看方式探讨 @H_404_10@保护WCF服务具体 *** 作步骤剖析 @H_404_10@Silverlight消耗WCF服务实现步骤及重要.. @H_404_10@IIS托管WCF服务实际 *** 作中常见错误分析 @H_404_10@WCF元数据交换应用技巧分享

WCF回调的必要条件:

1、并不是所有的绑定都支持回调 *** 作,只有具有双向通信能力的绑定才可以使用回调。比如http是与连接无关的因此不能用于回调。这就说明我们不能 使用BasichttpBinding或WShttpBinding进行回调。WCF中NetTcpBinding和 NetnamedPipeBinding支持回调,因为从本质上讲TCP和IPC协议支持双向通信。WCF中wsDualhttpBinding也是支持 回调的因为它实际上是设置了两个http通道

定义回调契约

一个服务契约若要定义回调,必须专门定义一个用于回调的契约。一个服务契约最多包含一个回调契约,一个服务契约一旦定义了回调契约那客户端必须支持 这个WCF回调 *** 作。那如何为一个服务契约定义回调呢?使用ServiceContract特性的CallBackContract特性,代码如下:

  [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]        @H_404_10@public interface IService1      {       @H_404_10@[OperationContract( IsOneWay = true )]       voID DoSomething();       @H_404_10@}  
//用于回调的契约   @H_404_10@interface ISomeCallbackContract {   @H_404_10@[OperationContract( IsOneWay = true )]  
voID SomeCallbackMethod();  
@H_404_10@[OperationContract(IsOneWay = true)]  
voID SomeCallbackMethod2();   @H_404_10@}

客户端WCF回调 *** 作设置

客户端需要实现服务端定义的那个用于回调的契约ISomeCallbackContract,然后实例化回调对象再通过它创建一个上下文对象 InstanceContext。然后用代理把这个回调的引用传回服务端

下面通过代码实例说明:

服务端代码:

  [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]  
@H_404_10@public interface IService1   {   @H_404_10@[OperationContract( IsOneWay = true )]   voID DoSomething();   @H_404_10@}   //用于回调的契约   @H_404_10@interface ISomeCallbackContract   {   @H_404_10@[OperationContract( IsOneWay = true )]   voID SomeCallbackMethod();   @H_404_10@[OperationContract(IsOneWay = true)]   voID SomeCallbackMethod2();   @H_404_10@} 实现服务的类:
  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, 
ConcurrencyMode = ConcurrencyMode.Reentrant)]  
@H_404_10@public class Service1 : IService1   {   @H_404_10@static List < ISomeCallbackContract >  m_Callbacks = new List < ISomeCallbackContract > ();   public voID DoSomething()   @H_404_10@{   //获得由客户端传入的回调终结点的引用,使用这个引用可以调用客户端方法   @H_404_10@ISomeCallbackContract callback = OperationContext.Current.GetCallbackChannel < ISomeCallbackContract > ();   if (m_Callbacks.Contains(callback) == false)   @H_404_10@{ m_Callbacks.Add(callback);   @H_404_10@}   Trace.Writeline("DoSomething");   @H_404_10@//调用客户端实现的SomeCallbackMethod2方法,   callback.someCallbackMethod2();   @H_404_10@CallClIEnts();   }   @H_404_10@static public voID CallClIEnts()   {   @H_404_10@Action < ISomeCallbackContract >  invoke = delegate(ISomeCallbackContract callback)  
{   @H_404_10@callback.someCallbackMethod(); };   @H_404_10@m_Callbacks.ForEach(invoke); }   @H_404_10@}

客户端代码:

  //客户端实现回调接口,使用VS自动生成代理的时候,对于回调接口的命名默认是
以服务契约接口名称+Callback,而不是原先在服务端定义的回调接口的名子  
@H_404_10@public class CallBack : ServiceReferenceCallBack.IService1Callback   {   @H_404_10@public voID SomeCallbackMethod()   {   @H_404_10@MessageBox.Show("SomeCallbackMethod()", "MyClIEnt");   }   @H_404_10@public voID SomeCallbackMethod2()   {   @H_404_10@MessageBox.Show("SomeCallbackMethod2()", "MyClIEnt");   }   @H_404_10@}

客户端调用

首先生成回调接口实现的对象,然后用这个对象去实例化一个上下文对象context ,在创建客户端代理对象的时候在构造方法中使用这个上下文对象context 就可以把客户端回调对象的引用作为消息的一部分传送到服务端,在服务端就可以通过 OperationContext.Current.GetCallbackChannel<ISomeCallbackContract> ()来获得这个回调对象的引用,服务端有了这个回调对象的引用就可以去调用客户端实现的WCF回调 *** 作方法。

  ServiceReferenceCallBack.IService1Callback callback = new CallBack();        @H_404_10@InstanceContext context = new InstanceContext(callback);       ServiceReferenceCallBack.Service1ClIEnt sc = new
WCFPrograme.ServiceReferenceCallBack.Service1ClIEnt(context);  
@H_404_10@sc.DoSomething(); 总结:

1、必须使用支持双向通信的绑定如NetTcpBinding、NetnamedPipeBinding、WSDualhttpBinding

2、用 CallbackContract 为服务定义回调,回调的接口在服务端定义。

      例:

       [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]

3、服务端用 OperationContext.Current.GetCallbackChannel<T>()获取调用当前 *** 作的客户端实例通道

       例:

ISomeCallbackContract callback = OperationContext.Current.GetCallbackChannel<ISomeCallbackContract>()

4、服务端获得客户端实例通道的对象以后就可以调用客户端方法

     例:

      callback.someCallbackMethod2();

5、客户端生成代理以后,由客户端去实现回调接口

      例:

      public class CallBack : ServiceReferenceCallBack.IService1Callback
      {
        //实现接口
       }

6、客户端创建回调的对象并生成 *** 作调用的上下文并由客户端代理对象传回服务端

 例:

              7、配置文件:使用wsDualhttpBinding的时候,需要在客户端配置文件中需要指定客户端基址clIEntBaseAddress,服务可以通过这个地址与客户端取得联系,这是因为wsDualhttpBinding需要两条http通道,而是使用netTcpBinding时不需要        

代码
                           <              endpoint address              =              "              http://localhost:8731/Design_Time_Addresses/WcfCallBack/Service1/              "              
2 binding = " wsDualhttpBinding " bindingConfiguration = " WSDualhttpBinding_IService1 "
3 contract = " ServiceReferenceCallBack.IService1 " name = " WSDualhttpBinding_IService1 " >
4 < IDentity >
5 < dns value = " localhost " />
6 </ IDentity >
7 </ endpoint >
8
9
< wsDualhttpBinding >
10 < binding name = " WSDualhttpBinding_IService1 " closeTimeout = " 00:01:00 "
11 openTimeout = " 00:01:00 " receiveTimeout = " 00:10:00 " sendTimeout = " 00:01:00 "
12 bypassproxyOnLocal = " false " transactionFlow = " false " hostnameComparisonMode = " StrongWildcard "
13
maxBufferPoolSize = " 524288 " maxReceivedMessageSize = " 65536 "
14 messageEnCoding = " Text " textEnCoding = " utf-8 " useDefaultWebProxy = " true "
15 clIEntBaseAddress = " http://localhost:8008 " >
16 < readerQuotas maxDepth = " 32 " maxStringContentLength = " 8192 " maxArrayLength = " 16384 "
17 maxBytesPerRead = " 4096 " maxnametableCharCount = " 16384 " />
18 < reliableSession ordered = " true " inactivityTimeout = " 00:10:00 " />
19 < security mode = " Message " >
20 < message clIEntCredentialType = " windows " negotiateServiceCredential = " true "
21 algorithmSuite = " Default " />
22 </ security >
23 </ binding >
24 </ wsDualhttpBinding >

1 ServiceReferenceCallBack.IService1Callback callback = new CallBack(); 2 InstanceContext context = new InstanceContext(callback);
3 ServiceReferenceCallBack.Service1ClIEnt sc = new WCFPrograme.ServiceReferenceCallBack.Service1ClIEnt(context);
4 sc.DoSomething();
总结

以上是内存溢出为你收集整理的WCF回调 *** 作以及应用技巧讲解全部内容,希望文章能够帮你解决WCF回调 *** 作以及应用技巧讲解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1029212.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存