用简单的英语委托远程对象(真的,就这么简单)






3.38/5 (8投票s)
2003年6月27日
2分钟阅读

68978

1303
变得简单:如何解决远程处理中的 FileNotFoundException 错误。
引言
如果您还记得我的上一篇文章,它是关于一个简单的远程聊天程序(基于 .NET Framework SDK v1.0,VB.NET),它有一个问题……您只能从与Server.exe相同的目录启动Client.exe。这是因为客户端需要服务器程序集的某些元数据来创建服务器的代理版本。完成之后,您才能在服务器以外的目录中启动客户端。虽然该错误已在 .NET Framework SDK 上得到纠正,并且解决方案在 KB312114 (针对 V1.0) 中进行了解释,但它相当晦涩难懂。虽然他们为他们的控制台聊天程序提供了一个修复程序,但我还是想更清楚地解释一下解决方案需要什么,以及如何在 .NET Framework SDK v1.1 上用 C# 来实现它。
原因
简单来说,委托需要接收对象(我们的 ClientUI
)能够从服务器程序集中获取类型信息。
解决方案
此修复需要一个如上所示的设计。
- 步骤 1:创建一个抽象类,确保它可以从
ClientUI
和服务器访问。为了使远程委托在我们的远程聊天中工作,必须将包含回调函数的抽象类(在本例中为
RemotelyDelegatableObject
)放在客户端和服务器都可以访问的公共程序集(Manager.dll,在InBetween
命名空间下)中(即,Manager.dll 将放置在与ClientUI
和服务器相同的目录中)。 - 步骤 2:实现抽象类
该解决方案要求我们的客户端 (
ClientUI
) 从这个抽象类 (RemotelyDelegatableObject
) 派生出一个自定义类 (OurCallBack
类) 来实现回调中的逻辑。 - 步骤 3:创建一个公共函数 (
OurInternalCallback
) 作为最终的回调(不能被重写)使用该函数,将所有调用转发到客户端派生类
ClientUI
中重写的一个受保护的抽象函数(private
,abstract
,OurInternalCallback
)。这允许委托绑定到回调函数 (OurInternalCallback
) 的具体实现,并且此实现不能被重写。
注意:SubmitEventArgs
继承自 EventArgs
只是为了允许我们传入更多自定义信息。
适应 V1.1
适应 V1.1 需要对我们的 *config* 文件进行细微更改。
我们需要将 typeFilterLevel
添加到 Formatter
标签。
下面显示的是 ClientUI.exe 的 .config。
<configuration>
<system.runtime.remoting>
<application>
<client>
<!-- TODO: Change the host and port name -->
<wellknown
type="InBetween.Manager, Manager"
url="http://UP:12345/RemotingChat"
/>
</client>
<channels>
<channel
ref="http"
name="ClientRemotingChatChannel"
port="8888">
<clientProviders>
<formatter ref="soap" />
</clientProviders>
<serverProviders>
<formatter ref="soap" typeFilterLevel="Full" />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
下面显示的是 Server.exe 的 .config。
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
type="InBetween.Manager, Manager"
objectUri="RemotingChat"
mode="Singleton"
/>
</service>
<channels>
<channel
ref="http server"
name="RemotingChatChannel"
port="12345">
<serverProviders>
<provider ref="wsdl" />
<formatter ref="soap" typeFilterLevel="Full" />
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
历史
2003 年 6 月 27 日,星期五:上传第一个版本。