WCF开发插件对于开发人员来说是一个比较重要的应用工具,可以帮助我们轻松的实现一些特定的功能需求。在这里我们就一起来分享一下有关WCF回调操作的相关操作技巧。WCF回调操作简单的说就是由服务端来调用客户端的方法,回调时原先的服务端和客户端将发生对调,服务端成为客户端,客户端成为服务端。#t#
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的汤原网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
WCF回调的必要条件:
1、并不是所有的绑定都支持回调操作,只有具有双向通信能力的绑定才可以使用回调。比如HTTP是与连接无关的因此不能用于回调。这就说明我们不能使用BasicHttpBinding或WSHttpBinding进行回调。WCF中NetTcpBinding和 NetNamedPipeBinding支持回调,因为从本质上讲TCP和IPC协议支持双向通信。WCF中wsDualHttpBinding也是支持回调的因为它实际上是设置了两个HTTP通道
定义回调契约
一个服务契约若要定义回调,必须专门定义一个用于回调的契约。一个服务契约最多包含一个回调契约,一个服务契约一旦定义了回调契约那客户端必须支持这个WCF回调操作。那如何为一个服务契约定义回调呢?使用ServiceContract特性的CallBackContract特性,代码如下:
- [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]
- public interface IService1
- {
- [OperationContract(IsOneWay=true)]
- void DoSomething();
- }
- //用于回调的契约
- interface ISomeCallbackContract
- {
- [OperationContract(IsOneWay=true)]
- void SomeCallbackMethod();
- [OperationContract(IsOneWay = true)]
- void SomeCallbackMethod2();
- }
客户端WCF回调操作设置
客户端需要实现服务端定义的那个用于回调的契约ISomeCallbackContract,然后实例化回调对象再通过它创建一个上下文对象InstanceContext。然后用代理把这个回调的引用传回服务端
下面通过代码实例说明:
服务端代码:
- [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]
- public interface IService1
- {
- [OperationContract(IsOneWay=true)]
- void DoSomething();
- }
- //用于回调的契约
- interface ISomeCallbackContract
- {
- [OperationContract(IsOneWay=true)]
- void SomeCallbackMethod();
- [OperationContract(IsOneWay = true)]
- void SomeCallbackMethod2();
- }
实现服务的类:
- [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,
ConcurrencyMode = ConcurrencyMode.Reentrant)]- public class Service1 : IService1
- {
- static List
m_Callbacks = new
List(); - public void DoSomething()
- {
- //获得由客户端传入的回调终结点的引用,使用这个引用可以调用客户端方法
- ISomeCallbackContract callback = OperationContext.Current.
GetCallbackChannel(); - if (m_Callbacks.Contains(callback) == false)
- {
- m_Callbacks.Add(callback);
- }
- Trace.WriteLine("DoSomething");
- //调用客户端实现的SomeCallbackMethod2方法,
- callback.SomeCallbackMethod2();
- CallClients();
- }
- static public void CallClients()
- {
- Action
invoke =
delegate(ISomeCallbackContract callback)- {
- callback.SomeCallbackMethod();
- };
- m_Callbacks.ForEach(invoke);
- }
- }
客户端代码:
- //客户端实现回调接口,使用VS自动生成代理的时候,对于回调接口的命名默认是
以服务契约接口名称+Callback,而不是原先在服务端定义的回调接口的名子- public class CallBack : ServiceReferenceCallBack.IService1Callback
- {
- public void SomeCallbackMethod()
- {
- MessageBox.Show("SomeCallbackMethod()", "MyClient");
- }
- public void SomeCallbackMethod2()
- {
- MessageBox.Show("SomeCallbackMethod2()", "MyClient");
- }
- }
客户端调用
首先生成回调接口实现的对象,然后用这个对象去实例化一个上下文对象context ,在创建客户端代理对象的时候在构造方法中使用这个上下文对象context 就可以把客户端回调对象的引用作为消息的一部分传送到服务端,在服务端就可以通过 OperationContext.Current.GetCallbackChannel
- ServiceReferenceCallBack.IService1Callback callback = new CallBack();
- InstanceContext context = new InstanceContext(callback);
- ServiceReferenceCallBack.Service1Client sc = new
WCFPrograme.ServiceReferenceCallBack.Service1Client(context);- sc.DoSomething();
名称栏目:WCF回调操作是鸡应用技巧讲解
文章来源:http://www.shufengxianlan.com/qtweb/news45/23245.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联