- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
局域网内多机间程序协作的一种方法
局域网内多机间程序协作的一种方法
--使用WCF服务双向回调
? 前几天,有个朋友问我wcf回调的问题,他想做协同工作程序,开始以为很简单,因为以前在项目中用过回调来处理程序(网页)之间的事件消息传递。可是做了下来,发现还是要费一些时间,特别是在处理服务器回调客户端然后返回的时候,遇到了一些问题,逐渐解决了它们,所以,把这个过程的一些要点记录下来,并且附上源代码,以供同道参考。我用的vs2012,win7。尽量详细些。
为什么需要程序间的协作
在一个功能复杂的软件系统中,总是涉及到多个角色的操作人员使用此系统,运行此系统的硬件环境也是由多台计算机和其他设备构成的一个或多个局域网。我们知道不同的角色分工不同,但相互之间有联系,有制约,反映到软件上叫做数据有交互。目前绝大多数的大型软件系统都把需要交互的数据放到一个叫“数据库”的软件系统中。这对于会产生大量数据的软件应用来说十分重要。但是数据量并不多的情况下,或是系统中的多数用户不愿承担泄露数据的风险的情况下,程序需要协作又是怎么办呢。
我们知道,要协作必然有一个提出要求的一方,有一个接受要求并回答结果的一个,它们分别叫客户和服务。最简单的是只涉及两个程序的应答协作,客户问什么,服务马上答什么,还有两种比较复杂,1、服务接受到客户发出的内容后,需要让其它客户知道,也即是通知其它客户。2、服务在回答之前需要根据客户(发出调用的客户或者其它客户)的情况来决定对调用客户的应答内容。
这两种情况的应用例子:在一个群组里面聊天的用户能够接收其它用户的聊天内容,另一个例子是,一个在ATM取钱的用户,如果改卡已经被冻结,是不能够取到钱的。把这些例子综合起来,提取出两种形态:服务通知客户类型的叫“单向回调”和服务检查客户类型的“双向回调”(因为一般都是客户调用服务,所以服务调用客户叫回调)。我们把单向回调想象成抛石头和钓鱼,石头抛了就不管(把别人的头打破了要除外^_^),鱼竿抛了你还要拉回来(钓到了军舰要除外^_^)。
以下介绍的是使用微软的WCF和WPF、C#实现回调的功能。
实现wcf单向回调
1、建立了WPF应用程序工程--取名wcfServerTest
2、在解决方案中新建wcf服务库取名WcfServiceLibrary
A.在接口文件中增加:
如下的接口:
public?interface?ICalculatorDuplexCallback?//回调接口
{
????[OperationContract(IsOneWay?=?true)]
????void?ShowCustomerName(string?msg);
????????
}
服务接口增加修饰:
[ServiceContract(CallbackContract?=?typeof(ICalculatorDuplexCallback))]
GetData函数增加修饰:
[OperationContract(IsOneWay=true)]
?
B.改造服务实现文件:
增加函数:
ICalculatorDuplexCallback?Callback
{
????//获取当前客户端ICalculatorDuplexCallback实例的通道
????get
????{
????????return?OperationContext.Current.GetCallbackChannelICalculatorDuplexCallback();
????}
}
改造GetData函数如下:
string?msg=?string.Format(You?entered:?{0},Name:,?value.ToString());
Callback.ShowCustomerName(msg);
C.改造配置文件:
服务基地址改为:
net.tcp://localhost:8733/Service1/
绑定为:
netTcpBinding
元数据终结点的绑定为:
mexTcpBinding?
?
3、在wcfServerTest工程中引用WcfServiceLibrary工程,在启动服务中使用如下代码:
try
{
????host?=?new?ServiceHost(typeof(Service1));
????????????????
????host.Open();
?
}
catch?(Exception?ex)
{
????Console.WriteLine(An?exception?occurred:?{0},?ex.Message);
????host.Abort();
?
}
关闭服务程序的代码是:
try
{
?
?
????host.Close();
?
}
catch?(Exception?ex)
{
????Console
文档评论(0)