C# Remoting是.NET Framework提供的一种技术,用于在不同的应用程序域(AppDomain)之间进行通信,甚至跨越网络。它允许对象在不同的进程或机器上透明地互相调用方法,仿佛它们是在同一环境中。Remoting提供了多种通信模式和协议,使得分布式系统开发变得更加简单。
在IIS负载下的服务器配置中,我们通常会在IIS建立一个虚拟目录,比如`remotingtest`,指向实际的程序文件路径,如`d:\Test`。在这个目录下创建一个`bin`子目录,并将相关的DLL文件和配置文件(如`Web.config`)放入相应位置。配置文件中,`<system.runtime.remoting>`元素是定义Remoting行为的关键部分。
1. 服务器激活配置:
- `<wellknown>`元素用于声明服务器上公开的远程对象。`mode`属性可以设置为`Singleton`(单例模式)或`SingleCall`(一次性调用),分别表示对象被创建一次并为所有客户端共享,或者每次调用都创建新对象。
- `objectUri`属性定义了对象的URI,客户端通过这个URI来访问服务。
- `type`属性指定了类型全名,包括命名空间、类名以及程序集名称。
例如:
```xml
<wellknown mode="SingleCall" objectUri="RemotingTestSrv.rem" type="RemotingTestSrv.RemotingTestSrv, RemotingTestSrv" />
```
这里创建了一个SingleCall模式的对象,可以通过`RemotingTestSrv.rem` URI访问。
2. 客户端激活配置:
- `<activated>`元素用于声明客户端需要激活的远程对象类型。客户端会根据配置自动创建这些类型的对象实例。
例如:
```xml
<activated type="RemotingTestSrv.RemotingTestSrv, RemotingTestSrv" />
```
这表示客户端会激活`RemotingTestSrv`命名空间下的`RemotingTestSrv`类。
3. 渠道(Channels)配置:
- `<channel>`元素定义了数据传输使用的通道,如HTTP或TCP。`ref`属性指定通道类型,`port`属性指定端口号。
例如:
```xml
<channel port="9000" ref="http" />
<channel port="4242" ref="tcp" />
```
这设置了两个通道,一个用于HTTP(端口9000),另一个用于TCP(端口4242)。
4. 客户端配置:
- `<client>`元素下的`<wellknown>`子元素用于指定客户端连接的远程对象,`url`属性定义了服务器的位置。
例如:
```xml
<wellknown type="RemotingTestSrv.RemotingTestSrv, RemotingTestSrv" url="http://localhost/RemotingTest/RemotingTestSrv.rem" />
```
这表示客户端将连接到本地主机的`RemotingTestSrv.rem`服务。
C# Remoting的优点包括:
- 支持多种通信协议和传输机制。
- 允许对象跨进程和网络透明通信。
- 提供丰富的配置选项和灵活性。
然而,随着.NET Framework的发展,Remoting逐渐被WCF(Windows Communication Foundation)取代,因为WCF提供了更统一、更安全、更高效的通信模型。尽管如此,在某些特定场景下,C# Remoting仍然是一个有效的选择,特别是在处理遗留系统或对性能有特殊需求的项目中。