您的位置:首页 > 其它

浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式

2015-09-29 15:59 567 查看
一: WCF的服务端与客户端在通信时有三种模式:请求响应模式、数据报模式和双工通讯模式。

说一下基本知识,

    1、如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契约

2、要想将方法作为wcf服务方法发布给外部调用,则一定要加上 [OperationContract]契约

3、实体类作为wcf方法参数或者返回值的话,则要贴上 [DataContract]

4、只有贴上了[DataMember]的属性才能作为wcf服务器方法参数值类传递,否则第三方调用者看不到此属性

二:请求响应模式:当客户端发出请求以后,一定要等待wcf服务的方法处理完成后才会响应给客户端,此过程中,客户端处于等待过程。如果服务端在处理大数据,很长的逻辑,执行耗时长,就不建议使用这种模式了。

实例:

//服务端接口:

[ServiceContract]

public interface IWcfService

{

[OperationContract]

string GetData(int value, int value2);

}

//服务端实现

public class WcfService : IWcfService

{

public string GetData(int value,int value2)

{

Thread.Sleep(10000);

return string.Format("你输入的是: {0}", value + value2);

}

}

下面我们用一个控制台程序托管WCF服务(也可以用windows服务托管等)

class StartService

{

static void Main()

{

using (ServiceHost host = new ServiceHost(typeof(WcfServiceLibrary.WcfService)))

{

host.Open();

Console.WriteLine("Wcf服务已启动,输入stop命令,停止服务!");

while (!Console.ReadLine().Equals("stop"))

{

Console.WriteLine("停止服务命令不正确!输入stop命令,停止服务!");

}

host.Close();

Console.WriteLine("Wcf服务已停止!!!");

}

Console.ReadKey();

}

}

//客户端调用(这里就用WinForm来测试)

     WcfServiceClient client = new WcfServiceClient();

MessageBox.Show(client.GetData(10, 15));

client.Close();


上面我们让服务端线程挂起10秒,这个时候客户端只有等待10秒才能接收处理结果

三:数据报模式

要点:1.方法不能用返回值

   2.在方法契约上加上[OperationContract(IsOneWay=true)]

数据报方法做的业务一般都是比较耗时的,一般分为如下类型:

    1、长时间的数据库操作 ,比如海量表的拆分操作

     2、长时间的IO操作,比如长时间的文件保存

实例

//服务器端接口:

[ServiceContract]

public interface IServiceForOneWay

{

[OperationContract(IsOneWay=true)]

void GetData(int value);

}

//服务器端实现:

public class ServiceForOneWay : IServiceForOneWay

{

public void GetData(int value)

{

Thread.Sleep(5000);

string v = value.ToString();

}

}

//客户端调用(同上,我们用Winform测试)

  ServiceForOneWayClient OneWayClient = new ServiceForOneWayClient();

OneWayClient.GetData(10);

MessageBox.Show("调用完毕");


上例中:只要调用GetData方法,调用完毕会马上显示,因为是单向的数据报模式,从方法契约的命名参数IsOneWay=true我们就知道意思了。单向为true。但这样客户端就不知道服务器处理结果。

四:双工通讯模式

双工通讯wcf服务特点:

1、双工方法的返回值为void

2、方法必须为数据报方法

3、服务契约必须强制开启Session同时指定回调接口类型

4、配置文件中必须在终结点中指定绑定模式为双工通信模式,

支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我们这里用wsDualHttpBinding为例

实例:

1 //服务器端接口
2
3     [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IResult))]
4
5     public interface IServiceForwsDual
6
7     {
8
9         [OperationContract(IsOneWay = true)]
10
11         void GetData(string value);
12
13     }
14
15     /// <summary>
16
17     /// 回调接口,会被客户端的子类来实现
18
19     /// </summary>
20
21     public interface IResult
22
23     {
24
25         [OperationContract(IsOneWay = true)]
26
27         void DispalyResult(string result);
28
29 }
30
31 //服务器端实现:
32
33 /// <summary>
34
35     /// 在ServiceForwsDual构造函数中得到当前请求客户端的回调实例对象
36
37     /// </summary>
38
39     public class ServiceForwsDual : IServiceForwsDual
40
41     {
42
43         IResult result=null;
44
45         public ServiceForwsDual()
46
47         {
48
49             //获取当前客户端请求上下文中的回调接口具体实现类的对象
50
51             result = System.ServiceModel.OperationContext.Current.GetCallbackChannel<IResult>();
52
53         }
54
55         public void GetData(string value)
56
57         {
58
59             System.Threading.Thread.Sleep(5000);
60
61
62
63             result.DispalyResult("我是服务器,我处理完成了!");
64
65         }
66
67     }
68
69 //客户端调用:
70
71 //在代理客户端的构造函数中,传入第2步实现的回调接口的具体类对象
72
73   ServiceForwsDualClient wsDualClient = new ServiceForwsDualClient(new System.ServiceModel.InstanceContext(new DwsDualResult()));
74
75     wsDualClient.GetData("哈哈");
76
77     MessageBox.Show("我是客户端,我处理完成了");


上例中:客户端调用后,会在5秒后再次‘alert‘出我是服务器,我处理完成了!

上面例子都是利用线程的挂起来模拟大数据,复杂耗时的逻辑处理。





五:源码下载:WCFStudy

如有错误,欢迎留言批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: