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/ "1 ServiceReferenceCallBack.IService1Callback callback = new CallBack(); 2 InstanceContext context = new InstanceContext(callback);
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 >
3 ServiceReferenceCallBack.Service1ClIEnt sc = new WCFPrograme.ServiceReferenceCallBack.Service1ClIEnt(context);
4 sc.DoSomething();
以上是内存溢出为你收集整理的WCF回调 *** 作以及应用技巧讲解全部内容,希望文章能够帮你解决WCF回调 *** 作以及应用技巧讲解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)