WCF服务创建与使用(双工模式)

简介:

昨天发布了《WCF服务创建与使用(请求应答模式)》,今天继续学习与强化在双工模式下WCF服务创建与使用,步骤与代码如下。

第一步,定义服务契约(Service Contract),注意ServiceContract特性上需指定回调契约

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
26
//服务契约
using  System.ServiceModel;
 
namespace  WcfServiceLibrary1
{
     [ServiceContract(Namespace = "http://www.zuowenjun.cn" ,
      CallbackContract = typeof (ICallback))]
     public  interface  IHello
     {
         [OperationContract(IsOneWay = true )]
         void  SetName( string  name);
     }
}
 
//回调契约(由于回调契约本质也是一个服务契约,所以定义方式和一般意义上的服务契约基本一样。
//有一点不同的是,由于定义服务契约时候已经通过[ServiceContract(CallbackContract=typeof(ICallback))]指明ICallback是一个服务契约了,所以ICallback不再需要添加ServiceContractAttribute特性)
using  System.ServiceModel;
 
namespace  WcfServiceLibrary1
{
     public  interface  ICallback
     {
         [OperationContract(IsOneWay = true )]
         void  ShowHello( string  name);
     }
}

第二步,实现服务契约,这里通过OperationContext.Current.GetCallbackChannel()获取回调契约

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using  System.ServiceModel;
 
namespace  WcfServiceLibrary1
{
     [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
     public  class  HelloService:IHello
     {
         public  void  SetName( string  name)
         {
             ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
             callback.ShowHello(name);
         }
     }
}

注意:ConcurrencyMode = ConcurrencyMode.Reentrant是设置并发模式,Reentrant与Multiple均可适用于多并发,默认是Single

第三步,创建服务寄宿程序,方法很多,我这里采取常用的配置方法

1.CONFIG文件配置部份:

(注: 1.在WCF预定义绑定类型中,WSDualHttpBinding和NetTcpBinding均提供了对双工通信的支持,但是两者在对双工通信的实现机制上却有本质的区别。WSDualHttpBinding是基于HTTP传输协议的;而HTTP协议本身是基于请求-回复的传输协议,基于HTTP的通道本质上都是单向的。WSDualHttpBinding实际上创建了两个通道,一个用于客户端向服务端的通信,而另一个则用于服务端到客户端的通信,从而间接地提供了双工通信的实现。而NetTcpBinding完全基于支持双工通信的TCP协议。
2.若绑定类型采用NetTcpBinding,则地址应变更为:net.tcp://127.0.0.1:10800/HelloService,且不能有behaviorConfiguration配置

1
2
3
4
5
6
7
8
9
10
11
<? xml  version="1.0" encoding="utf-8" ?>
< configuration >
   < system.serviceModel >
     < services >
       </ service >
       < service  name="WcfServiceLibrary1.HelloService">
         < endpoint  address="http://127.0.0.1:10800/HelloService" binding="wsDualHttpBinding" contract="WcfServiceLibrary1.IHello"></ endpoint >
       </ service >
     </ services >
   </ system.serviceModel >
</ configuration >

2.代码部份:

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
26
using  System;
using  WcfServiceLibrary1;
using  System.ServiceModel;
using  System.ServiceModel.Description;
 
 
namespace  ConsoleApplicationHost
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             BuildHelloServiceHostByConfig();
         }
 
         static  void  BuildHelloServiceHostByConfig()
         {
             using  (ServiceHost host = new  ServiceHost( typeof (HelloService)))
             {
                 host.Opened += (s, e) => { Console.WriteLine( "HelloService已经启动,按按回车键终止服务!" ); };
                 host.Open();
                 Console.ReadLine();
             }
         }
     }
}

第四步,客户端程序调用WCF服务

注:在客户端程序中首先需要创建或引用WCF服务类库,然后创建实现回调契约的类

实现回调契约:

1
2
3
4
5
6
7
8
9
10
11
12
13
using  System;
using  WcfServiceLibrary1;
 
namespace  ConsoleApplicationClient
{
     public  class  HelloCallBack:ICallback
     {
         public  void  ShowHello( string  name)
         {
             Console.WriteLine( "Hello! {0}.欢迎光临IT文俊社区网,地址:www.zuowenjun.cn" ,name);
         }
     }
}

1.CONFIG文件配置部份:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<? xml  version="1.0" encoding="utf-8" ?>
< configuration >
     < system.serviceModel >
         < bindings >
           < wsDualHttpBinding >
             < binding  name="HelloServiceBinding" clientBaseAddress="http://127.0.0.1:10801/HelloServiceCallback"></ binding >
           </ wsDualHttpBinding >
         </ bindings >
         < client >
           < endpoint  name="HelloService" address="http://127.0.0.1:10800/HelloService" binding="wsDualHttpBinding" contract="WcfServiceLibrary1.IHello">
           </ endpoint >
         </ client >
     </ system.serviceModel >
</ configuration >

2.代码部份:

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
26
27
28
29
30
31
32
using  System;
using  System.ServiceModel;
using  WcfServiceLibrary1;
 
namespace  ConsoleApplicationClient
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             CallHelloService();
             Console.WriteLine( "按任意键结束。" );
             Console.Read();
         }
 
         static  void  CallHelloService()
         {
             Console.Write( "请输入您的网名:" );
             string  input = Console.ReadLine();
             InstanceContext instanceContext = new  InstanceContext( new  HelloCallBack());
             using  (DuplexChannelFactory<IHello> channel = new  DuplexChannelFactory<IHello>(instanceContext, "HelloService" ))
             {
                 IHello proxy = channel.CreateChannel();
                 using  (proxy as  IDisposable)
                 {
                     proxy.SetName(input);
                     Console.ReadLine(); //注意这句需保留,目的是为了阻止调用proxy的Dispose方法,因为该方法将会试图关闭底层的TCP连接。由于服务端的回调操作也会使用该TCP连接,如果在回调操作尚未执行完毕就试图关闭网络连接,将会导致回调无法正常执行
                 }
             }
         }
     }
}

 

这里特别说明一下,建议在定义服务方法时,若没有返回值,建议为方法添加IsOneWay=True特性,可以使客户端不用等待请求回复,虽然设置ConcurrencyMode = ConcurrencyMode.Reentrant,但若采用WINFORM客户端使用,则会出现TIMEOUT错误,具体分析与解决方法,详见:我的WCF之旅(6):在Winform Application中调用Duplex Service出现TimeoutException的原因和解决方案

说明:发表这篇文章参考了如下作者的文章:

我的WCF之旅(3):在WCF中实现双工通信

 

文章同步发表于我的个人网站:http://www.zuowenjun.cn/post/2015/03/25/133.html

本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/4366939.html  ,如需转载请自行联系原作者

相关文章
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
70 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
102 0
|
C++
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
136 0
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
|
安全 网络协议 网络安全
WCF安全3-Transport与Message安全模式
WCF安全3-Transport与Message安全模式
126 0
WCF安全3-Transport与Message安全模式
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
889 0
|
Windows
WCF服务寄宿到IIS
一.WCF简介: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
1091 0
WCF服务自我寄宿
WCF服务的寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有: IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。
1031 0
|
JavaScript