wcf双工通信

一直以为感觉双工没弄懂,着实觉得很惆怅,在网上了解下双工的一些特点,直接上代码,以便以后项目中用的着:

service层:

?





1

定义一个IDuplexHello服务接口

?





1

2

3

4

5

6

7

8

9

10

11

[ServiceContract(

      Name = "DuplexHello",

      Namespace = "http://microsoft.wcf.documentation",

      CallbackContract = typeof(IHelloCallbackContract), //设置回调服务类型

      SessionMode = SessionMode.Required

    )]

    public
interface IDuplexHello

    {

        [OperationContract]

        void
Hello(string
greeting);

    }

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

实现DuplexHello.cs

public
class DuplexHello : IDuplexHello

    {

        public
void Hello(string
greeting)

        {

            Console.WriteLine("Caller sent: "
+ greeting);

            Console.WriteLine("Session ID: "
+ OperationContext.Current.SessionId);

            Console.WriteLine("Waiting two seconds before returning call.");

            Thread.Sleep(2000);

            var
callerProxy

                = OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();

            var
response = "Service object "
+ this.GetHashCode().ToString() + " received: "
+ greeting;

            Console.WriteLine("Sending back: "
+ response);

            callerProxy.Reply(response);

        }

    }

?





1

定义回调接口(回调服务函数没有必要添加servicecontract,因为人家是包含在IDuplexHello服务类型中的)

?





1

2

3

4

5

public
interface IHelloCallbackContract

    {

        [OperationContract(IsOneWay = true)]   //一定要记得添加operationcontract

        void
Reply(string
responseToGreeting);

    }

?





1

2

3

4

5

6

7

8

这里的回调接口实现类(HelloCallbackContract.cs)我是直接在service层实现的,当然在项目里面肯能大多数情况下都是在客服端实现,我这里也就为了方便啦

 public
class HelloCallbackContract : IHelloCallbackContract

    {

        public
void Reply(string
responseToGreeting)

        {

            Console.WriteLine(responseToGreeting);

        }

    }

将service寄宿到控制台应用程序中(用的都是代码实现):

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

private
static void Main(string[] args)

        {

            using
(var
host = new
ServiceHost(typeof
(DuplexHello),

                                              new
Uri("http://localhost:991/DuplexHello"))) //添加基地址,在client就是这个地址,另外端口号不能鱼双工端口号相同

            {

                host.AddServiceEndpoint(typeof
(IDuplexHello),

                                        new
NetTcpBinding(),

                                        "net.tcp://localhost:999/DuplexHello");  

                var
metadatbehavior =

                    host.Description.Behaviors.Find<ServiceMetadataBehavior>();

                if
(metadatbehavior == null)

                {

                    metadatbehavior = new
ServiceMetadataBehavior()

                        {

                            HttpGetEnabled = true

                        };

                    host.Description.Behaviors.Add(metadatbehavior);

                }

                host.Opened += delegate

                    {

                        Console.WriteLine("服务已经启动");

                    };

                host.Open();

                Console.Read();

            }

client层使用的也是一个控制台应用程序:

首先要运行宿主(找到host层资源文件夹bin->debug
 :host.exe)在更新wcf服务的时候也必须要先运行host.exe,否则会出现无法连接到服务器错误,

然后添加服务引用中地址栏输入http://localhost:991/DuplexHello 应用服务

再后应用之后客户端app.config自动生成如下代码:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<configuration>

  <system.serviceModel>

    <bindings>

      <netTcpBinding>

        <binding name="NetTcpBinding_DuplexHello"
/>

      </netTcpBinding>

    </bindings>

    <client>

      <endpoint address="net.tcp://localhost:999/DuplexHello"

                binding="netTcpBinding"

                bindingConfiguration="NetTcpBinding_DuplexHello"

                contract="ServiceReference1.DuplexHello"

                name="NetTcpBinding_DuplexHello">

        <identity>

          <userPrincipalName value="objectboy-PC\objectboy"
/>

        </identity>

      </endpoint>

    </client>

  </system.serviceModel>

</configuration>

客服端控制台应用程序中代码:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

private
static void Main(string[] args)

        {

            var
hellocallbackcontract =

                new
HelloCallbackContract();

            var
instanceContext =

                new
InstanceContext(hellocallbackcontract);   //实例化客服端类服务上下文

            var
duplexChannelFactory =

                new
DuplexChannelFactory<IDuplexHello>(instanceContext,

                                                       new
NetTcpBinding());   //实例化双工通道,并绑定为tcp通信,注意不能用ChannelFactory,因为这是双工

            var
endpointaddress =

                new
EndpointAddress("net.tcp://localhost:999/DuplexHello");

            var
proxy =

                duplexChannelFactory.CreateChannel(endpointaddress); //创建并将消息发送到指定的消息通道

            using
(proxy as
IDisposable)

            {

                proxy.Hello("cccccccccccccccccc");

            }

            Console.Read();

        }

客服端输出:

服务端输出:

时间: 2024-08-05 19:36:55

wcf双工通信的相关文章

Wcf 双工通信的应用

概述 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具有一些变体,比如典型的订阅-发布模式就可以看成是双工模式的一种表现形式.双工消息交换模式使服务端回调(Callback)客户端操作成为可能. 在Wcf中不是所有的绑定协议都支持回调操作,BasicHttpBinding,WSHttpBinding绑定协议不支持回调操作:NetTcpBindin

WCF系列之双工通信

WCF双工通信允许客户端调用服务器端,也允许通过回调,实现服务器端调用客户端,并不是所有的协议都支持双工通信,比如HTTP协议是不支持双工通信的. 我们来看一下契约的定义,其中在ServiceContract指定了CallbackContract,定义了ICalculateCallback,回调契约不需要指定为ServiceContract,但是方法要标记为OperationContract,可以看到服务契约和回调的方法均指定为IsOneWay=true,返回值都是void. 下一步,再来看一下

【转】WCF入门教程五[WCF的通信模式]

一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,如下图所示(图中的粗红线在此时代表顺序并不代表调用): 请求与答复模式为WCF的默认模式,如下代码所示: 1 [OperationContract] 2 string ShowName(string name); 即使返回值是void 也属于请求与答复模式. 缺点:

WCF系列之WCF的通信模式

一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,如下图所示(图中的粗红线在此时代表顺序并不代表调用): 请求与答复模式为WCF的默认模式,如下代码所示: [OperationContract] string ShowName(string name); 即使返回值是void 也属于请求与答复模式. 缺点:如果用W

无废话WCF入门教程五[WCF的通信模式]

一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,如下图所示(图中的粗红线在此时代表顺序并不代表调用): 请求与答复模式为WCF的默认模式,如下代码所示: 1 [OperationContract] 2 string ShowName(string name); 即使返回值是void 也属于请求与答复模式. 缺点:

什么是半双工和双工通信

全双工(Full Duplex)是指在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音.目前的网卡一般都支持全双工. 半双工(Half Duplex),所谓半双工就是指一个时间段内只有一个动作发生,举个简单例子,一条窄窄的马路,同时只能有一辆车通过,当目前有两量车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理.早期的对讲机.以及早期集线器等设备都是基于半双工的产品.随着技术的不断进步,半双工会逐渐退出历

什么是单工、半双工和双工通信?有哪些实际应用的例子

根据数据信息在传输线上的传送方向,数据通信方式分为单工通信 半双工通信和全双工通信3种. 1)单工通信 数据信息在通信线上始终向一个方向传输.数据信息永远从发送端传输到接收端.列如,广播电视就是单工传输方式,收音机电视机只能分别接受来自电台 电视台的信号,不能进行相反方向的信息传输. 2)半双工通信 数据信息可以双向传输,但必须交替进行,同一时刻一个信道只允许单向传送.半双工通信要求A B端都有发送装置和接受装置,若想改变信息的传输方向,有开关K1 K2进行切换,再任意时刻保证A端发送装置与B端

WCF -- Duplex双工通信

[老老实实学WCF] 第十篇 消息通信模式(下) 双工:http://blog.csdn.net/songyefei/article/details/7409607 WCF 学习总结4 -- 用Duplex实现消息广播 : http://blog.csdn.net/fangxing80/article/details/6142861

C# WCF的通信模式

wcf 通信模式一般分为三种; 1,请求/响应模式 2,单工模式 3,双工模式 一,请求/响应模式 请求/响应通信是指客户端向服务端发送消息后,服务端会向客户端发送响应.这也意味着在接收到服务的响应以前,客户端不会继续执行操作. 缺点 – 如果执行操作需要很长的时间,则会降低客户端性能和响应能力. 优点 – 响应消息中可返回SOAP 错误,这表明可能在通信或处理中发生了一些与服务有关的错误状况. 例题: 如,上上节所示.直接添加WCF服务应用程序 二,单工模式 单向通信应是指通信只在一个方向进行