如何通过Remoting实现双向通信
Remoting是NET平台下比较成熟高效的分布式技术,我们习惯采用传统的远程调用的方式使用Remoting。在客户端所在的Application Domain,我们通过Proxy(Transparent Proxy)远程地跨Application Domain调用一个方法。当来自Client端的调用请求通过Proxy到达Server端所在的Application Domain后,Remoting Infrastructure在Server 端激活(Activate)相应的远程对象(一个继承子System.MarshalByRefObject类对象)——这里仅仅以服务端激活对象(Server Activated Object——SAO),然后再Server端执行相应的操作后把Result传递给Proxy,并最终到达Client。这是一种典型的Request/Response的调用方式。 我之所以一直比较推崇在.NET平台下使用Remoting而非XML Web Service是因为我觉得.NET Remoting是一种比较成熟的分布式技术。它自身提供了XML Web Service很多不具备的特性,其中对双向通信的支持就是一个很好的体现。 相对于典型的Request/Response的消息交换模式(Message Exchange Pattern——MEP),双向通信实质上是采用的Duplex的MEP。也就是说,Server端在执行操作的时候,可以回调(Callback)Client端的操作(这个操作时再Client端的Application Domain中执行的)。 现在我们来看如何一步一步实现在Remoting环境下的双向通信。在下面的Sample中,我们的逻辑是:调用一个数学计算的远程调用,除了传递相应的操作数之外,我们还传递一个对象,这个对象可以在Server端中回调 (Callback) 把运算结果在Client端显示出来。可以通过下面的URL下载源代码:http://www.cnblogs.com/files/artech/Artech.DuplexRemoting.zip
步骤二、定义ContractIDuplexCalculator 1: public interface IDuplexCalculator 3: void Add(double x,double y,ICalculatorCallback callback); interface ICalculatorCallback 4: } 步骤三、定义远程对象类型DuplexCalculatorRemoting 5: Console.WriteLine("Invoke the method Add({0},{1}).",x,y);
7: callback.ShowResult(x,y,result); 9: } 步骤四、Host远程对象App.config 2: system.runtime.remoting>
5: wellknown mode="SingleCall" 7: objectUri="DuplexCalculator.soap" /> 10: channels 11: channel ref="http" port="8080" 12: serverProviders 13: provider ="wsdl" 14: formatter ="binary" typeFilterLevel="Full" /> class Program 5: System.Runtime.Remoting.RemotingConfiguration.Configure("Artech.DuplexRemoting.Hosting.exe.config",1)">false);
7: Console.Read(); Remoting会反序列化所有类型。如果你想知道那些类型是在Low Level下被限制,请参考http://msdn2.microsoft.com/en-us/library/5dxse167.aspx。 之所以要把typeFilterLevel为Full,是因为我们的远程调用里包含一Callback对象,它实际上是一个继承System.MarshalByRefObject类对象(这个的对象将在Artech.DuplexRemoting.Client中定义)。而这个对象是不会再Low Level下被自动反序列化。
3: 4: }
步骤五、定义Callback对象类型和调用远程对象CalculatorCallbackHandler double result)
7: } App.config
14: 15: 16: >
Program.cs
7: InvocateDuplexCalculator("http://localhost:8080/Calculator/DuplexCalculator.soap");
11: { 13: proxy.Add(1,2,1)">new CalculatorCallbackHandler()); 15: } Server端了来说Callback对象实际上是一个远程对象(在Callback过程中Client端转变成Server端,而Server端转变成Client端)。Server端需要注册一些Channel用于Client访问寄宿在Server端的远程对象,同理,Server需要Callback一个寄宿在Client端Application Domain中的Callback对象,Client端需要注册相应的Channel;
和Server端一样,我们必须设置Full。?
到现在为止我们已经完成了所有的Program,我们来运行一下,在客户端你将得到如下的输出: Remoting有两种Host方式Self Host和IIS Host,上面我们把Remoting Host到一个Console Application中; 现在我们把试着把它Host到IIS中。实际上我们要做的工作很简单。
Hosting,就可以运行Client了。
我所理解的.NET Remoting:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – 基于字符串创建ViewBag属性
- asp.net-mvc – 使用Ajax在ASP.NET MVC的Kendo UI中级联Dro
- asp.net-core – 在IIS Express上运行MVC6 Beta8应用程序
- asp.net(c#)动态修改webservice的地址和端口(动态修改配置
- asp.net-mvc – ASP.NET MVC检查角色里面的视图
- asp.net-mvc-3 – MVC将JSON ViewModel传递给View
- asp.net – IE bug无效源HTML5音频 – 解决方法
- ASP.NET路由 – 自定义路由完全跳过Global.asax中的所有内容
- asp.net-mvc-3 – ASP.NET MVC 3:如何在控制器方法中获取用
- asp.net-core-mvc – 在ExecuteResult Asp.Net MVC Core中访
- asp.net – 将Crystal报表导出到文本文件 – 没有
- 使用asp.net中的Enterprise Library实现日志文件
- asp.net – 检查site.master页面中的条件
- asp.net-mvc-3 – 尝试检索不存在的列的实体框架
- 经典ASP和ASP.NET集成
- asp.net – 为不同项目中的所有Web应用程序网页添
- asp.net – 每个应用程序池的内存使用
- asp.net-core – 我为什么要选择带有.Net核心的A
- asp.net – 在Web.config帮助中定义tagPrefixes
- asp.net-mvc – MVC 4:强制ScriptBundle返回Jav