WCF学习笔记(2)---消息交换模式
2012-04-26 16:48
218 查看
WCF是基于消息的开发框架。其中,消息交换的模式一共有三种,分别为:数据报、请求/应答和双工。
数据报交换模式: 用于单向的消息发送。即发即弃。
请求/应答交换模式: 也叫半双工。一方请求,另一方应答。 类似于对讲机。
双工交换模式: 也叫全双工,发送者和接收者可以互发消息。类似于电话。
示例代码:
契约:
1 [ServiceContract(CallbackContract = typeof(IExampleCallbackClass))]
2 public interface IExampleClass
3 {
4 [OperationContract(IsOneWay = true)]
5 void SendMessage(string message);
6
7 [OperationContract()]
8 string RequestMessage();
9
[OperationContract(IsOneWay = true)]
void SendMessageAgain(string message);
}
public interface IExampleCallbackClass
{
[OperationContract(IsOneWay= true)]
void CallBack(string message);
18 }
实现:
1 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
2 public class ExampleClass : IExampleClass
3 {
4 public void SendMessage(string message)
5 {
6 Console.WriteLine("Send Message: " + message);
7 }
8 public string RequestMessage()
9 {
return "Request and Response!";
}
public void SendMessageAgain(string message)
{
Console.WriteLine("Send message again: " + message);
var callBack = OperationContext.Current.GetCallbackChannel<IExampleCallbackClass>();
callBack.CallBack("Send Callback: " + message);
}
}
public class ExampleCallbackClass : IExampleCallbackClass
{
public void CallBack(string message)
{
Console.WriteLine("Print Callback :" + message);
}
26 }
调用:
1 static void Main(string[] args)
2 {
3 // 启动服务
4 WSDualHttpBinding dualBinding = new WSDualHttpBinding(WSDualHttpSecurityMode.None);
5 dualBinding.MessageEncoding = WSMessageEncoding.Text;
6
7 Uri address = new Uri("http://localhost:8000/Datapram", UriKind.Absolute);
8 ServiceHost svc = new ServiceHost(typeof(ExampleClass));
9 svc.AddServiceEndpoint(typeof(IExampleClass), dualBinding, address);
svc.Open();
Console.WriteLine("WCF服务已经启动!");
// 调用服务
WSDualHttpBinding remoteBinding = new WSDualHttpBinding(WSDualHttpSecurityMode.None);
EndpointAddress remoteAddress = new EndpointAddress(
new Uri("http://localhost:8000/Datapram", UriKind.Absolute));
IExampleCallbackClass callBack = new ExampleCallbackClass();
IExampleClass proxy = DuplexChannelFactory<IExampleClass>.CreateChannel(callBack, remoteBinding, remoteAddress);
//数据报交换模式
proxy.SendMessage("some message");
// 请求应答模式
string responseString = proxy.RequestMessage();
Console.WriteLine("收到服务器的应答:" + responseString);
// 双工
proxy.SendMessageAgain("message");
Console.WriteLine("服务调用成功!");
Console.ReadLine();
}
35 }
数据报和请求/调用的绑定,可以使用 WSHttpBinding 来做,因为,三种方式都写入到一个示例里,所以用了 WSDualHttpBinding。
需要注意的部分:在IExampleClass 的实现中,需要声明特性:[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)].如果不声明,运时的时候会报"操作将死锁..."的异常。出现这个异常的原因是:在默认的情况下,服务的执行按Single并发模式进行,也就是说在服务执行全程,服务对象只能被一个线程访问。WCF通过加锁机制保证服务对象的独占性使用,也就是说在服务执行开始会对服务对象加锁,该锁在服务操作结束之后释放。
数据报交换模式: 用于单向的消息发送。即发即弃。
请求/应答交换模式: 也叫半双工。一方请求,另一方应答。 类似于对讲机。
双工交换模式: 也叫全双工,发送者和接收者可以互发消息。类似于电话。
示例代码:
契约:
1 [ServiceContract(CallbackContract = typeof(IExampleCallbackClass))]
2 public interface IExampleClass
3 {
4 [OperationContract(IsOneWay = true)]
5 void SendMessage(string message);
6
7 [OperationContract()]
8 string RequestMessage();
9
[OperationContract(IsOneWay = true)]
void SendMessageAgain(string message);
}
public interface IExampleCallbackClass
{
[OperationContract(IsOneWay= true)]
void CallBack(string message);
18 }
实现:
1 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
2 public class ExampleClass : IExampleClass
3 {
4 public void SendMessage(string message)
5 {
6 Console.WriteLine("Send Message: " + message);
7 }
8 public string RequestMessage()
9 {
return "Request and Response!";
}
public void SendMessageAgain(string message)
{
Console.WriteLine("Send message again: " + message);
var callBack = OperationContext.Current.GetCallbackChannel<IExampleCallbackClass>();
callBack.CallBack("Send Callback: " + message);
}
}
public class ExampleCallbackClass : IExampleCallbackClass
{
public void CallBack(string message)
{
Console.WriteLine("Print Callback :" + message);
}
26 }
调用:
1 static void Main(string[] args)
2 {
3 // 启动服务
4 WSDualHttpBinding dualBinding = new WSDualHttpBinding(WSDualHttpSecurityMode.None);
5 dualBinding.MessageEncoding = WSMessageEncoding.Text;
6
7 Uri address = new Uri("http://localhost:8000/Datapram", UriKind.Absolute);
8 ServiceHost svc = new ServiceHost(typeof(ExampleClass));
9 svc.AddServiceEndpoint(typeof(IExampleClass), dualBinding, address);
svc.Open();
Console.WriteLine("WCF服务已经启动!");
// 调用服务
WSDualHttpBinding remoteBinding = new WSDualHttpBinding(WSDualHttpSecurityMode.None);
EndpointAddress remoteAddress = new EndpointAddress(
new Uri("http://localhost:8000/Datapram", UriKind.Absolute));
IExampleCallbackClass callBack = new ExampleCallbackClass();
IExampleClass proxy = DuplexChannelFactory<IExampleClass>.CreateChannel(callBack, remoteBinding, remoteAddress);
//数据报交换模式
proxy.SendMessage("some message");
// 请求应答模式
string responseString = proxy.RequestMessage();
Console.WriteLine("收到服务器的应答:" + responseString);
// 双工
proxy.SendMessageAgain("message");
Console.WriteLine("服务调用成功!");
Console.ReadLine();
}
35 }
数据报和请求/调用的绑定,可以使用 WSHttpBinding 来做,因为,三种方式都写入到一个示例里,所以用了 WSDualHttpBinding。
需要注意的部分:在IExampleClass 的实现中,需要声明特性:[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)].如果不声明,运时的时候会报"操作将死锁..."的异常。出现这个异常的原因是:在默认的情况下,服务的执行按Single并发模式进行,也就是说在服务执行全程,服务对象只能被一个线程访问。WCF通过加锁机制保证服务对象的独占性使用,也就是说在服务执行开始会对服务对象加锁,该锁在服务操作结束之后释放。
相关文章推荐
- WCF初探-4:WCF消息交换模式之请求与答复模式
- WCF的消息交换模式
- WCF初探-4:WCF消息交换模式之请求与答复模式
- WCF面向服务应用程序系列之十七:消息交换模式(MEP)-单向操作
- wcf 基础知识 之 消息交换模式 response/reply oneway deplex
- WCF从理论到实践(7):消息交换模式
- WCF面向服务应用程序系列之十八:消息交换模式(MEP)-回调操作
- wcf消息交换模式
- WCF初探-5:WCF消息交换模式之双工通讯(Duplex)
- WCF学习总结——WCF消息交换模式
- WCF从理论到实践(7):消息交换模式
- WCF消息交换模式之Duplex
- WCF学习笔记之消息交换模式
- 消息交换模式 response/reply oneway deplex
- WCF 消息交换模式
- 《WCF技术内幕》翻译14:第1部分_第3章_消息交换模式、拓扑与编排:消息交换模式(MEP)
- 艾伟:WCF从理论到实践(7):消息交换模式
- WCF消息交换模式之双工通讯(Duplex)
- 《WCF技术内幕》翻译14:第1部分_第3章_消息交换模式、拓扑与编排:消息交换模式(MEP)
- WCF的消息交换模式