在任何情况下,都应该记住要使用标准的设备使用和监视方法。事件记录仍是非常有价值的信息资源,就象网络监视器工具一样,网络监视器可以专门用于详细查看客户端/服务器的 Remoting 会话。中间层的 Remoting 服务器仍可以使用 Visual Studio .NET 提供的标准调试工具进行调试,例如,对于由 IIS 集成的 Remoting 服务器,可以通过向 ASP.NET 辅助进程附加调试会话(Visual Studio .Net | Debug [调试] | Processes [进程] | Attach [附加]) 来设置断点(如果资源可用)。但 Remoting 的错误很独特,下面列出了一些。请注意,所有错误都已使用 .NET Framework SDK 提供的 Basic Remoting Hello Sample 的各版本进行了复现,服务器和客户端也已在单机上运行。故障现象与在网络链接上的相同,只是由于 HTTP/TCP 的超时设置不同,需要相当长的时间才能出现错误。
丢失 MarshalByRef
由于 Remoting 要通过引用以用于给定的类,该类必须只做一件事,就是继承 MarshalByRefObject。假设开发人员忘记做这项工作,我们将得到一个 System.Runtime.Remoting.RemotingException 类型的异常,说明我们有一个“丢失的 MarshalByReference”.
是否能正确捕获和处理这个 RemotingException 将取决于程序员。(想想这个开发人员忘记了他应记住的唯一一件事。)
解决方法是:记住继承 MarshalByRefObject!
众所周知的服务器激活的错误服务器端点
对于服务器激活(请参阅产品特性一节),Remoting 服务器将其侦听处声明为端点。该端点一般包括一个对象 URI(远程对象的众所周知名称),一个协议和一个端口号。当然,所有这些都可能配置错误。
错误的 URI
由服务提供的 Basic Remoting Hello Sample 的 URI 是 HelloService.soap,如相关的 web.config 文件中所指定:
| <configuration> <system.runtime.remoting> <application> <service> <wellknown mode="SingleCall" type="Hello.HelloService, Hello" objectUri="HelloService.soap" /> </service> </application> </system.runtime.remoting> </configuration> |
此服务是 IIS 集成的。IIS 集成要求 URI 带有后缀 .rem 或 .soap,我们在服务器上使用 .rope。在此实例中,我们将再次收到 RemotingException,这次显示的文本是“对象 </Hello.soap> 在服务器上已断开或不存在”。
请确保各个 URI 相互匹配!当 IIS 集成 Remoting 服务器时,还要确保 URI 以 .rem 或 .soap 结尾。
不匹配的协议/端口
为了进行此项测试,我们切换到控制台集成的服务器,以下是该服务器的配置文件:
| <configuration> <system.runtime.remoting> <application name="RemotingHello"> <service> <wellknown mode="SingleCall" type="Hello.HelloService, Hello" objectUri="HelloService.soap" /> </service> <channels> <channel ref="http" port="8000" /> </channels> </application> </system.runtime.remoting> </configuration> |
假设我们要在服务器端将协议更改为 TCP,而使客户端保留 HTTP。
我们将再次收到 RemotingException,这次的文本是“底层连接已关闭:接收时出现意外错误”。
端口设置错误也会导致上述异常,唯一的不同是这种情况下,要用较长的时间才会出现错误。服务器和客户端之间的端口和协议必须匹配。
丢失 URI
另一种可能性是远程服务器没有运行,例如,服务器由 IIS 集成,而虚拟应用程序或相关的程序集丢失。再次使用 Basic Hello Remoting 服务器,我们需要虚拟应用程序 RemotingHello 能够运行。如果不能运行,我们将收到未处理的异常(取决于调用代码),但这次的异常将是:“无法加载类型 clr:Hello.HelloService, Hello”。
在这些情况下,请确保虚拟应用程序在运行,而且所需的程序集正确地放置在相关的 bin 子文件夹中。
总而言之,客户端必须正确地引用服务器定义的端点以便激活服务器,这意味着,端口、协议和 URI 的定义必须相互匹配。这太容易出错了。因此,如果服务器的位置定义为:
| <service> <wellknown mode="SingleCall" type="Hello.HelloService, Hello" objectUri="HelloService.soap" /> </service> |
那么,客户的设置必须为:
| <client url="http://localhost/RemotingHello"> <wellknown type="Hello.HelloService, Hello" url="http://localhost/RemotingHello/HelloService.soap" /> </client> |
其中,URL 表示集成 Remoting 服务的 IIS 虚拟应用程序,类型表示类和程序集名称。
URl收藏 http://www.qqread.com/dotnet/y520949000.html相关专题
- .NET移动与嵌入式技术 (5950篇文章)
- .NET开发手册 (5652篇文章)
- vb.net入门——ToolBar 控件的使用 (267次浏览)
- vb.net入门——OpenFileDialog 组件的使用 (75次浏览)
- vb.net入门——FontDialog 组件的使用 (52次浏览)
- vb.net用Graphics画一个五角星 (46次浏览)
- vb.net入门——FolderBrowserDialog 组件的使 (45次浏览)
- vb.net绘制干扰点 (44次浏览)
- vb.net入门——ColorDialog 组件的使用 (41次浏览)
- vb.net巧用ToolTip控件获取鼠标坐标 (39次浏览)
- 用vb.net创建一个鼠标绘图程序 (39次浏览)
- vb.net入门——SaveFileDialog 组件的使用 (38次浏览)



