如何使用 WPF 应用程序中的 WCF RIA 服务

如何使用 WPF 应用程序中的 WCF RIA 服务,第1张

解决方法 1:

布拉德 · 艾布拉姆斯的博客上它前阵子,我不知道多少已在测试版中虽然。博客 -RIA 服务博客系列 在这里。

解决方法 2:

下面是一个示例: >

很久以前,有一家小商店,靠卖些水果过日子。竞争是如此激烈,为了生存,他们不得不自己进货,把货堆到自己的房间内,如果顾客需要,他们有时还不得不给顾客送货,总而言之,他们将所有该干的活都干了,只为了能赚到点生活费,这就是艰辛的人生。

一个web程序或者一个winform程序,简单模式的程序,我们通常都如那个水果店的老板一样,把所有的功能都集中到这个程序里,在简单的状况下,这很好。

水果店生意越来越好,老板的资金慢慢雄厚了,他注意到了卖其他东西比卖水果更赚钱,比如说家电、服装。于是,老板一口气又开了几家店。生意规模越来越大,钱也越赚越多,老板心花怒放。然而好景不长,亚洲金融风暴来袭,利润率急剧下降。老板忧心忡忡,既然外部开源不太可能,那就看看内部能不能节流了。老板考察一番,注意到,为了销售,每个店都配置了一个仓库,每个店都配置了一帮送货的人马,这,是不是太浪费了。于是,老板将所有的仓库撤销,成立了一个总仓库,不管是水果,家店,服装,都可以存储到这个仓库。管理一个仓库的费用比管理N个仓库的费用显然是要少很多的。然后,每个店的送货人员都辞掉,另外成立一个运输公司,专门负责送货,不过水果还是家店还是服装,装到纸箱后,他们都是一个样。经过这么一折腾,成本一下就降了下来,而且还便于管理了,真是一举两得,老板又绽放了笑容。

当程序涉及的范围越来越大时,也许就要考虑将服务分离出去。WCF是应对分布式开发的,就如水果店老板,生意大了后,他就是个分布式的了,这边一家水果店,那边一家服装店,他们之间有区别,卖的东西不同,也有共性,都是卖东西,不管是哪家店,他们都需要仓库,都需要送货。这时,你就可以单独成立公司,只提供这两种服务。如果写成程序,那么就如同你开发了一个运输的WCF,把这个服务放在服务器上,这样不管是谁,是Web程序也好,是Winform程序也好,只要接口对应,理解你的服务内容条款(服务契约),都可以要求你这个服务模块提供标准的服务。

懒得写了,就这样。

利用WPF技术可以编写出独立于平台的应用程序,它清晰地定义了设计和功能的界限。WPF借用并扩展了以前许多技术的概念和类,包括Windows窗体、ASPNET、XML、数据绑定技术及GDI+等。WPF开发的一个关键概念是设计与功能几乎完全分开。这样,设计人员和开发人员就可以一起开发项目,而在之前,要达到这样的灵活程度,需要使用高级设计概念或第三方工具。这个功能受到所有人的欢迎,包括小型团队、爱好开发的人员、合作开发大项目的大型开发团队和设计人员。前途一片光明。

WCF是Web服务和远程技术的替代品,它从Web服务中提取了服务、独立于平台的SOAP消息传输等概念,把它们与远程技术中的宿主服务器应用程序和高级绑定功能结合在一起,所以可以看成是一个超集,包含了Web服务和远程技术,但比Web服务强大,比远程技术可容易掌握。使用WCF可以从简单的应用程序转向使用面向服务的体系结构(SOA)的应用程序。SOA表示可以分散处理,并在需要时连接跨本地网络和Internet的服务和数据,使用分布式处理。

wcf:

var context = OperationContextCurrent;

var properties = contextIncomingMessageProperties; //获取传进的消息属性

var endpoint = properties[RemoteEndpointMessagePropertyName] as RemoteEndpointMessageProperty; //获取消息发送的远程终结点IP和端口

string UserLoginIp = endpointAddress; // 获取发送消息的客户端的 IP 地址。

string UserLoginProt = endpointPortToString(); //获取发送消息的客户端的端口号。

webservice:

string clientIP = >

这个问题是这样来的。

首先,你应该了解一下使用WCF方法异步(特指使用代理工具生成Begin/EndXXX异步方法)时Begin和End方法的特性。

BeginAdd在执行时并不会阻塞线程,它会立即返回一个IAsyncResult同步对象,该对象是受同步保护的内存块,会跨越一切困难维持着自身的一致性。当然,如果传入了一个回调方法(你的AddCallBack),则BeginAdd开始执行时会在调用方偷偷建立一个线程以等待同步信号,当服务端的Add方法执行完毕后本地线程会调用该回调。

再说EndAdd。此方法实际上是作为一种“保险”来使用,而非你的EndAdd(BeginAdd())这样。EndAdd是会阻塞线程的方法,实际的意义是“等待到Add方法结束并返回”。如此,你应该可以理解注释掉的

ConsoleWriteLine(scEndAdd(scBeginAdd(1, 2, 1000, null, null)));

是如何工作的了:

首先sc要求服务端异步执行Add方法且无回调,BeginAdd立即返回,但是EndAdd又要求等待至服务端Add结束。综上,此行代码其实等同于ConsoleWriteLine(scAdd(1,2,1000));

(这里顺便说一句,如果传入了一个回调,在回调开始执行的同时EndAdd也返回了)

那么

//为什么用这两行代码,最后GetOperateCount的结果是2

         

ConsoleWriteLine(scEndAdd(scBeginAdd(1, 2, 1000, null, null)));

             ConsoleWriteLine(scEndSub(scBeginSub(9, 4, 2000, null, null)));

因为其实你的代码都是“同步”的,先加,后减,然后“同步”GetOperationCount。

这一点是很容易验证的,比如你可以在以上两行后都加ConsoleWriteLine(scGetOperationCount());(此为同步方法)可以很明显的看出是先加后减的。

那么

//为什么用这两行代码,最后GetOperateCount的结果是0

         

IAsyncResult iaAdd= scBeginAdd(1, 2, 1000, AddCallback, sc);

            IAsyncResult iaSub = scBeginSub(1, 2, 1000, SubtractCallback, sc);

这个也很好理解,iaAdd和iaSub都被立即返回了,然后立刻”同步“打印了结果(scEndGetOperationCount(scBeginGetOperationCount())等同于scGetOperationCount())。

因为服务端方法执行需要时间,又或者是首次服务实例(你的服务InstanceContextModeSingle)实例化需要时间,很可能在服务端GetOperationCount方法会先于Add和Sub完成并返回,导致了输出为0。

这个也是可以验证的。

验证一:在GetOperationCount服务方法内加入

SystemThreadingThreadSleep(5000);

你会看到输出是正确的2,因为5秒内Add和Sub早已返回,连AddCallback和SubtractCallback都已执行完毕(从两个回调的输出可见)。

验证二:我们在服务端Add方法内延时1秒,在Sub方法内延时10秒,在GetOperationCount方法内延时5秒。猜猜看结果?先加再输出再减。(如果条件允许,请在三个服务方法上加断点,可以更好的观察到执行顺序)

以上为你的问题分析。这里我提个小小的建议:请按标准的做法来写程序。

如果需要同步执行,就直接执行同步方法;如果需要执行异步方法,请使用IAsyncResult及回调进行处理。End方法作为一种保险措施,是为了在本地已得知异步执行完毕后通知CLR释放相关资源所用,应该在你等待超过预期时间或者已经处理完异步结果后调用,通常End方法位于回调中,也有少数时间因为同步结果在其他地方处理因为挪到外部的情况。

异步有很多种实现方法,选择适合自己的一种。在不需要处理中间的过程数据时,我个人更喜欢下面的做法。至少省掉了生成异步方法的 *** 作。

ThreadPoolQueueUserWorkItem(()=>

{            double result = scSub(ar);            ConsoleWriteLine("Subtract Result : " + result);});

就这么多,有问题请PM。

以上就是关于如何使用 WPF 应用程序中的 WCF RIA 服务全部的内容,包括:如何使用 WPF 应用程序中的 WCF RIA 服务、如何使用webinvoke方法传入WCF其余全身多个参数、求教:wcf是干什么用的啊...等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10206059.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存