WCF实现全双工例子(1)


  1. 全双工的一些细节

  • 基于Http协议(wsDualHttpBinding)的全双工回调接口的几个注意点:

  1. 下面的binding="wsDualHttpBinding"一定要是支持全双工的协议;

      <service name="dualService.Dog" >

        <host>

          <baseAddresses>

            <add baseAddress="http://localhost:1709/Design_Time_Addresses/dualService.Dog/" />

          </baseAddresses>

        </host>

        <endpoint address="" binding="wsDualHttpBinding"  contract="dualService.IDog"/>

        <endpoint address="mex" binding="mexHttpBinding"  contract="IMetadataExchange"/>

 </service>

  1. 服务契约一定要加上标注[ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(IResult))],这个SessionMode=SessionMode.Required是一直开启会话验证,为此服务设置回调接口(注意:类是不能作为回调的),即CallbackContract=typeof(IResult))。最后一定要为操作契约设置为单项模式,即[OperationContract(IsOneWay=true)]

[ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(IResult))]

    public interface IDog

    {

        [OperationContract(IsOneWay=true)]

        void Fly(FlyTarget conposite);

    }

    [ServiceContract]

    public interface IResult

    {

        [OperationContract(IsOneWay = true)]

        void Result(string result);

}

  1. .svc文件中获取当前操作上下文的回调接口的回调管道,即Irslt=OperationContext.Current.GetCallbackChannel<IResult>();,并且使用该接口对象调用该接口中声明的方法,即Irslt.Result("取经失败!")。这里调用接口IResult中的Result方法,实质上是为客户端回调接口的时候,出发这个方法而准备的。

IResult Irslt = null;

        public Dog()

        {

            Irslt = OperationContext.Current.GetCallbackChannel<IResult>();

        }

        public void Fly(FlyTarget conposite)

        {

            if(conposite.Magheight>500)

            {

                Irslt.Result("取经失败!");

            }

            else

            {

                Irslt.Result("取经成功!");

            }

        }

  1. 最后,在客户端调用服务,并且使用服务调用Fly()方法,这样就可以触发回调接口的方法,然后再客户端在实现服务生成的回调接口IDogCallback即可可完成整个接口回调。

       static void Main(string[] args)

        {

            //using (DogClient dc = new DogClient(new System.ServiceModel.InstanceContext(new Result1())))

            //{

                DogClient dc = new DogClient(new System.ServiceModel.InstanceContext(new Result1()));

                FlyTarget fly = new ServiceReference1.FlyTarget()

                {

                    Magheight = 400

                };

                dc.Fly(fly);

            //}

            Console.ReadKey();

        }

    }

    public class Result1:IDogCallback

    {

        public void Result(string result1)

        {

            Console.Write(result1);

            Console.ReadKey();

        }

}

总结,在这个例子中,除开标志服务契约和方法契约为单向模式、服务接口设置为SessionMode=Required以及标志回调接口以外,还要注意要在服务(.svc文件)获取当前操作上下文中的回调接口,然后使用该回调接口的对象调用接口中所需的方法(这里是Result()方法)。最后要在客户端实现服务生成的回调接口即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WCF双工通信(Duplex communication)是一种通信方式,它允许客户端和服务器之间进行双向通信。在传统的客户端/服务器模型中,客户端通过发送请求来获取服务器的响应,而服务器没有办法主动向客户端发送信息。但在某些情况下,需要服务器能够主动向客户端发送信息,这时就可以使用WCF双工通信。 实现WCF双工通信需要以下步骤: 1. 定义服务契约:在服务契约中,需要定义一个双工操作,该操作将用于客户端和服务器之间的双向通信。例如: ``` [ServiceContract(CallbackContract = typeof(IMyServiceCallback))] public interface IMyService { [OperationContract(IsOneWay = true)] void MyOperation(); } public interface IMyServiceCallback { [OperationContract(IsOneWay = true)] void MyCallback(); } ``` 上面代码中,`IMyService`是服务契约,它包含一个双工操作`MyOperation`。`IMyServiceCallback`是回调契约,它包含一个回调操作`MyCallback`,用于服务器向客户端发送信息。 2. 实现服务:实现服务契约中的操作,包括双工操作和回调操作。例如: ``` [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class MyService : IMyService { public void MyOperation() { // 客户端调用了MyOperation操作 // 这里可以向客户端发送信息 OperationContext.Current.GetCallbackChannel<IMyServiceCallback>().MyCallback(); } } public class MyServiceCallback : IMyServiceCallback { public void MyCallback() { // 服务器调用了MyCallback操作 // 这里可以接收客户端发送的信息 } } ``` 上面代码中,`MyService`类实现了`IMyService`接口,包含一个双工操作`MyOperation`,它可以调用回调操作`MyCallback`,向客户端发送信息。`MyServiceCallback`类实现了`IMyServiceCallback`接口,包含一个回调操作`MyCallback`,用于接收客户端发送的信息。 3. 配置服务:在配置文件中配置服务绑定和终结点,以启用双工通信。例如: ``` <bindings> <netTcpBinding> <binding name="MyBinding" sendTimeout="00:01:00"> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" /> <security mode="None" /> </binding> </netTcpBinding> </bindings> <services> <service name="MyNamespace.MyService"> <endpoint address="" binding="netTcpBinding" bindingConfiguration="MyBinding" contract="MyNamespace.IMyService" /> </service> </services> ``` 上面代码中,使用`netTcpBinding`绑定配置了一个名为`MyBinding`的绑定,用于双工通信。在服务配置中,使用该绑定配置了一个终结点,用于绑定服务契约和实现类。 完成上述步骤后,就可以通过WCF双工通信实现客户端和服务器之间的双向通信了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值