Duplex Services (Msdn)
Duplex Services from msdn
A duplex service contract is a message exchange pattern in which both endpoints can send messages to the other independently.
A duplex service, therefore, can send messages back to the client endpoint, providing event-like behavior.
Duplex communication occurs when a client connects to a service and provides the service with a channel on which the service can send messages back to the client.
Note that the event-like behavior of duplex services only works within a session.
To create a duplex contract you create a pair of interfaces.
The first is the service contract interface that describes the operations that a client can invoke.
That service contract must specify a callback contract in the ServiceContractAttribute.CallbackContract property.
The callback contract is the interface that defines the operations that the service can call on the client endpoint.
A duplex contract does not require a session, although the system-provided duplex bindings make use of them.
The following is an example of a duplex contract.
public interface ICalculatorDuplexCallback
{
[OperationContract(IsOneWay = true)]
void Equals(double result);
[OperationContract(IsOneWay = true)]
void Equation(string eqn);
}
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode = SessionMode.Required,
CallbackContract = typeof(ICalculatorDuplexCallback))]
public interface ICalculatorDuplex
{
[OperationContract(IsOneWay = true)]
void Clear();
[OperationContract(IsOneWay = true)]
void AddTo(double n);
[OperationContract(IsOneWay = true)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true)]
void DivideBy(double n);
}
The CalculatorService class implements the primary ICalculatorDuplex interface.
The service uses the PerSession instance mode to maintain the result for each session.
A private property named Callback accesses the callback channel to the client.
The service uses the callback for sending messages back to the client through the callback interface, as shown in the following sample code.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorDuplex
{
double result = 0.0D;
string equation; public CalculatorService()
{
equation = result.ToString();
} public void Clear()
{
Callback.Equation(equation + " = " + result.ToString());
equation = result.ToString();
} public void AddTo(double n)
{
result += n;
equation += " + " + n.ToString();
Callback.Equals(result);
} public void SubtractFrom(double n)
{
result -= n;
equation += " - " + n.ToString();
Callback.Equals(result);
} public void MultiplyBy(double n)
{
result *= n;
equation += " * " + n.ToString();
Callback.Equals(result);
} public void DivideBy(double n)
{
result /= n;
equation += " / " + n.ToString();
Callback.Equals(result);
} ICalculatorDuplexCallback Callback
{
get
{
return OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
}
}
}
The client must provide a class that implements the callback interface of the duplex contract, for receiving messages from the service.
The following sample code shows a CallbackHandler class that implements the ICalculatorDuplexCallback interface.
public class CallbackHandler : ICalculatorDuplexCallback
{
public void Equals(double result)
{
Console.WriteLine("Equals({0})", result);
} public void Equation(string eqn)
{
Console.WriteLine("Equation({0})", eqn);
}
}
The WCF client that is generated for a duplex contract requires a InstanceContext class to be provided upon construction.
This InstanceContext class is used as the site for an object that implements the callback interface and handles messages that are sent back from the service.
An InstanceContext class is constructed with an instance of the CallbackHandler class.
This object handles messages sent from the service to the client on the callback interface.
// Construct InstanceContext to handle messages on callback interface
InstanceContext instanceContext = new InstanceContext(new CallbackHandler()); // Create a client
CalculatorDuplexClient client = new CalculatorDuplexClient(instanceContext);
The configuration for the service must be set up to provide a binding that supports both session communication and duplex communication.
The wsDualHttpBinding element supports session communication and allows duplex communication by providing dual HTTP connections, one for each direction.
On the client, you must configure an address that the server can use to connect to the client, as shown in the following sample configuration.
Note:
Non-duplex clients that fail to authenticate using a secure conversation typically throw a MessageSecurityException.
However, if a duplex client that uses a secure conversation fails to authenticate, the client receives a TimeoutException instead.
If you create a client/service using the WSHttpBinding element and you do not include the client callback endpoint, you will receive the following error.
HTTP could not register URL
htp://+:80/Temporary_Listen_Addresses/<guid> because TCP port 80 is being used by another application.
The following sample code shows how to specify the client endpoint address in code.
WSDualHttpBinding binding = new WSDualHttpBinding();
EndpointAddress endptadr = new EndpointAddress("http://localhost:12000/DuplexTestUsingCode/Server");
binding.ClientBaseAddress = new Uri("http://localhost:8000/DuplexTestUsingCode/Client/");
The following sample code shows how to specify the client endpoint address in configuration.
<client>
<endpoint name ="ServerEndpoint"
address="http://localhost:12000/DuplexTestUsingConfig/Server"
bindingConfiguration="WSDualHttpBinding_IDuplexTest"
binding="wsDualHttpBinding"
contract="IDuplexTest" />
</client>
<bindings>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_IDuplexTest"
clientBaseAddress="http://localhost:8000/myClient/" >
<security mode="None"/>
</binding>
</wsDualHttpBinding>
</bindings>
Caution
The duplex model does not automatically detect when a service or client closes its channel.
So if a client unexpectedly terminates, by default the service will not be notified, or if a client unexpectedly terminates, the service will not be notified.
Clients and services can implement their own protocol to notify each other if they so choose.
Duplex Services (Msdn)的更多相关文章
- Windows HTTP Services
原文:https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa384273(v=vs.85).aspx Purpose (目的) Micr ...
- 当程序以Windows Services形式启动时当前路径不对
当程序以Windows Services形式启动时当前路径不对 @(操作系统)[博客|dotNet] 很多时候我们需要将我们的程序写成利用Windows服务的形式来让它能够自启动.今天遇到一个问题,当 ...
- SharePoint 2013 Excel Services REST API介绍
前言:Excel Services 中的 REST API 是 Microsoft SharePoint Server 2010 的新增项.利用 REST API,可通过 URL 直接访问工作簿部件或 ...
- SharePoint 2013 Excel Services ECMAScript 示例之明日限行
前言:最近遇到一个“明日限行”的功能,北京的交通啊,这个不在今天讨论范围内,暂不吐槽,想想代码开发,还要写WebPart部署,很麻烦,而且部署服务器,需要领导审批,想绕过这个麻烦事儿,就想到客户端了, ...
- (转载)SQL Reporting Services (Expression Examples)
https://msdn.microsoft.com/en-us/library/ms157328(v=SQL.100).aspx Expressions are used frequently in ...
- Configure Security Settings for Remote Desktop(RDP) Services Connections
catalogue . Configure Server Authentication and Encryption Levels . Configure Network Level Authenti ...
- 【HOW】如何通过URL给Reporting Services报表传递参数
[本地模式Reporting Services] 参见官方文档:http://msdn.microsoft.com/en-us/library/ms154042.aspx 示例:http://serv ...
- 充分利用 SQL Server Reporting Services 图表
最近在查SSRS的一些文章,看到MSDN在有一篇不错的文章,许多图表设置都有说明,共享给大家.. 其中有说明在SSRS中如果去写条件表达写和报表属性中的“自定义代码”,文章相对比较长,需要大家耐心的查 ...
- User Word Automation Services and Open XML SDK to generate word files in SharePoint2010
SharePoint 2010 has established a new service called "Word Automation Services" to operate ...
随机推荐
- 15个Linux Yum命令实例--安装/卸载/更新
在linux环境中, 安装, 卸载更新包是一个极为常见的操作.大部分的linux环境都提供了包的管理工具, 例如:apt-get, dpkg, rpm, yum等等. 一些Linux环境中,yum是默 ...
- 直接在存储过程里面写sql语句的话 ,会返回操作的结果
ALTER PROCEDURE [dbo].[sp_updateStuStateYRCode] @StuId varchar(100)ASBEGIN update StuState set KM1YR ...
- 数字证书简介及Java编码实现
1.数字证书简介 数字证书具备常规加密解密必要的信息,包含签名算法,可用于网络数据加密解密交互,标识网络用户(计算机)身份.数字证书为发布公钥提供了一种简便的途径,其数字证书则成为加密算法以及公钥的载 ...
- Linux - 引用
双引号 如果把文本放在双引号中,那么 shell 使用的所有特殊字符都将失去它们的特殊含义,而被看成普通字符.字符 "$"(美元符号)."\"(反斜杠).&qu ...
- Win7使用IIS通过域名访问本地程序(网页、css、js等)
一.目的:在本地浏览器里面,输入www.abc.com 可以访问我们本地搭建的网页程序 二.好处:在本地模拟,真实的访问,另外可以设置一些二级域名,例如static.abc.com域名用来存储像图片, ...
- 配置wamp开发环境【2】 配置wamp开发环境之mysql的配置
此前我已经将wamp配置的Apache.PHP.phpmyadmin全部配置完成,以上三种配置参照 配置wamp开发环境 下面我们来看看mysql的配置,这里用的是mysql5.5.20,下载地址: ...
- SQL语句like子句中的转义符 [转载]
如果想在SQL LIKE里查询有下划线'_'或是'%'等值的记录,直接写成like 'XXX_XX',则会把'_'当成是like的通配符.SQL里提供了 escape子句来处理这种情况,escape可 ...
- 原生Javascript实现控制DIV属性
写在前面: 从事前端工作已有一年之久,因为工作的性质,不太涉及JS方面,所以自己的JS水平一直处于小白阶段,工作闲暇之余,在网上找了一些小项目,希望练练手,促进自己成长.这是第一篇,后续还会有很多记录 ...
- max取得数组的最大值
var arr = [1,2,3,4,5,2,2,4,52,5,6,5,4,4]; var maxNum = Math.max.apply(Math,arr); var maxIndex = arr. ...
- json对象的处理
不同的服务器接受的json对象要处理 var str1 = '{"name": "Lucy", "age": 23}'; var str2 ...