Remoting编程知识二

编程

Remoting高级知识

一、 如何使用IIS作为激活代理

.NET Remoting和DCOM之间的一个区别是前者不支持自动运行的服务器进程。需要人工启动服务器进程来注册用来远程激活的类和监听请求。而对于DCOM,当远程客户端调用CoCreateInstanceEx或者其他激活API时,会自动运行服务器进程。

.NET remoting 提供了两种方法来避免人工启动服务器。第一个是将服务器应用程序当做一个服务来实现。可以编写一个从

System.ServiceProcess.Service派生的服务,重载其中关键的需方法例如OnStart和OnStop。将服务器当做一个服务来实现的好处是你可以配置该服务以便系统启动时能自动运行该服务。

第二个方法是使用IIS作为激活代理。IIS本身就是一个服务,在大多数Web Servers运行时会一直启动。而且IIS能够通过使用.NET Remoting机制来响应客户端激活对象的请求。使用IIS有以下几个好处:

1、不再需要编写一个用来注册可远程化的类和监听端口的服务器,IIS就是服务器。

2、可以使用IIS鉴别远程调用者,也可以使用SSL来保护数据。

3、可以使用IIS来管理端口。如果在一个机器上部署了两个传统的应用程序服务器,则需要你来保证这两个服务器使用不同的端口。使用IIS作为宿主,则IIS可以选择端口,这样可以简化发布和管理。

IIS支持服务器端激活对象和客户端激活对象。可以使用程序注册(在Global.asax中),也可以使用声明注册(在Web.config中)。

1、服务器端激活对象

下面的Web.config注册了使用IIS激活的Clock类:

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="SingleCall" type="Clock, ClockServer" objectUri="Clock.rem" />
</service>
</application>
</system.runtime.remoting>
</configuration>
注意Clock的URI:Clock.rem。使用IIS注册的URI必须以.rem或者.soap结束,因为该扩展对应到IIS原数据中的Aspnet_isapi.dll和Machine.config中的.NET remoting 子系统。

使用IIS激活对象都是通过HTTP通道来与客户端进行通信。客户端必须注册HTTP通道。下面是一个客户端如何创建一个Clock实例,假设Clock在本地机器上一个叫MyClock的虚拟目录中。

HttpClientChannel channel = new HttpClientChannel ();
ChannelServices.RegisterChannel (channel);
RemotingConfiguration.RegisterWellKnownClientType
(typeof (Clock),"http://localhost/MyClock/Clock.rem");
Clock clock = new Clock ();

注意服务器和客户端都没有指定端口,IIS选择该端口

2、客户端激活对象

Web.config文件注册注册一个客户端激活对象Clock

<configuration>
<system.runtime.remoting>
<application>
<service>
<activated type="Clock, ClockServer" />
</service>
</application>
</system.runtime.remoting>
</configuration>
下面是客户端的写法(依然假设Clock在本地机器MyClock虚拟目录中):

HttpClientChannel channel = new HttpClientChannel ();
ChannelServices.RegisterChannel (channel);
RemotingConfiguration.RegisterActivatedClientType
(typeof (Clock), "http://localhost/MyClock");
Clock clock = new Clock ();
注意:使用IIS必须在虚拟目录中有一个可远程化的类,而且必须把 Web.config放在单独的虚拟目录中(例如MyClock),把DLL放在bin子目录中(MyClock\bin)。

二、 如何通过HTTP通道传递二进制格式数据

使用IIS的一个缺点是只能使用HTTP通道。HTTP通道将调用封装成SOAP消息,这样会增加消息的长度。IIS只支持HTTP通道,但它并不要求使用将通道调用封装成SOAP消息。默认情况下,HTTP使用SOAP,因为它使用SoapClientFormatterSinkProvide和

SoapServerFormatterSinkProvider来作为序列化和反序列化消息的格式。可以使用BinaryClientFormatterSinkProvider和

BinaryServerFormatterSinkProvder来替换它们。二进制消息可以跟好的利用网络带宽。

下面的Web.config文件注册了一个可以被IIS激活的Clock,它使用二进制替换了缺省的SOAP格式。

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="SingleCall" type="Clock, ClockServer"
objectUri="Clock.rem" />
</service>
<channels>
<channel ref="http server">
<serverProviders>
<formatter ref="binary" />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
客户端写法如下:

HttpClientChannel channel = new HttpClientChannel
("HttpBinary", new BinaryClientFormatterSinkProvider ());
ChannelServices.RegisterChannel (channel);
RemotingConfiguration.RegisterWellKnownClientType
(typeof (Clock), "http://localhost/MyClock/Clock.rem");
Clock clock = new Clock ();
当使用配置文件时,写法为:

RemotingConfiguration.Configure ("Client.exe.config");
Clock clock = new Clock ();
配置文件内容如下:

<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown type="Clock, ClockServer"
url="http://localhost/MyClock/Clock.rem" />
</client>
<channels>
<channel ref="http client">
<clientProviders>
<formatter ref="binary" />
</clientProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>

使用相同的方法,你也可以在TCP通道中使用SOAP格式封装消息。你甚至可以将自己的格式化方法插入到现有的通道中。

三、 如何使用事件和代理

假设你创建了一个Clock 类,包括一个NewHour事件,代码如下:

public delegate void NewHourHandler (int hour);

public class Clock : MarshalByRefObject
{
public event NewHourHandler NewHour;
...
}
在IIS上使用的Web.config文件如下:

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="Singleton" type="Clock, ClockServer"
objectUri="Clock.rem" />
</service>
<channels>
<channel ref="http" />
</channels>
</application>
</system.runtime.remoting>
</configuration>

注意ref属性,http值使得two-way HttpCannel代替了one-way HttpServerChannel。

客户端写法如下:

RemotingConfiguration.Configure ("Client.exe.config");
Clock clock = new Clock ();
clock.NewHour += new NewHourHandler (OnNewHour);
.
.
.
public void OnNewHour (int hour)
{
// NewHour event received
}

<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown type="Clock, ClockServer"
url="http://localhost/MyClock/Clock.rem" />
</client>
<channels>
<channel ref="http" port="0" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
客户端也注册了一个two-way HttpChannel,并且指定端口号为0。0值使得通道监听回调,当然也可以允许.NET框架来选择端口数。

四、 如何异步调用一个可远程化对象

缺省情况下,,调用远程对象是同步的。

时间: 2024-10-04 00:37:22

Remoting编程知识二的相关文章

Remoting编程知识一

编程 Remoting基础 基本原理当客户端创建远程RemotableClass的一个实例,.NET框架在客户端应用程序域中产生一个代理.该代理看起来就像实际对象.代理收到调用后,通过通道连接到远程的对象. 一.编写步骤 第一步 编写一个DLL,其中包含所要Remottable的类 public class RemotableClass:MarshalByRefObject { -. } 第二步 服务器进程注册该remotable 类以便其他应用程序可以激活.根据该对象是如何激活,服务器通过两种

.NET Remoting编程简介

编程 .NET Remoting提供了一个功能强大.高效的处理远程对象的方法,从结构上而言,.NET Remote对象非常适合通过网络访问资源,而又无需处理由基于SOAP的WebServices所带来的难题..NET Remoting使用起来比Java的RMI简单,但要比创建Web Service难度大一些. 在本篇文章中,我们将创建一个从数据库读入内容的远程对象.文中还包括了一个忽略数据库功能的替补对象,以使没有数据库可以使用的读者仍然能够使用.NET Remoting. 第一步:创建共享库

java-初学编程知识,望各位帮忙解决

问题描述 初学编程知识,望各位帮忙解决 最近在学习Java ,如何让myeclipse用数据库中的数据??如何将数据库和myeclipse连接起来? 解决方案 import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Connection; import java.sql.Statement; public class MysqlDemo { pu

Android 开发者如何使用函数式编程 (二)

本文讲的是Android 开发者如何使用函数式编程 (二), 如果你没有读过第一部分,请到这里读: Android 开发者如何使用函数式编程 (一) 在上一篇帖子中,我们学习了纯粹性*.副作用和排序**.在本部分中,我们将讨论不变性和并发. 不变性 不变性是指一旦一个值被创建,它就不可以被修改. 假设我有一个像这样的 Car 类: public final class Car { private String name; public Car(final String name) { this.

Android编程实现二维码的生成与解析_Android

本文实例讲述了Android编程实现二维码的生成与解析.分享给大家供大家参考,具体如下: 直接上代码,代码上面有具体的解析,并且提供jar供下载:二维码Jar包.rar . 根据文本生成对应的二维码: // 生成QR图 private void createImage() { try { // 需要引入core包 QRCodeWriter writer = new QRCodeWriter(); String text = qr_text.getText().toString(); Log.i(

黄聪:SEO专家必须具备编程知识

黄聪认为:SEO专家必须具备编程知识.黄聪在学习SEO的时候,看到网络上流传着大量"零建站基础学习SEO,轻松月赚5000","不会建站怎么办?教你SEO赚钱月赚1万"等等广告.其实,懂得网赚并不等于懂得SEO. 懂得网赚不等于懂得SEO 相信很多自称SEO专家的人都不懂得编程,但是的确不妨碍他们将某些难度较大的词做上百度首页,因为他们有足够多的内容和外链,而有这些对于做一般的关键词已经足够了.但是他们真的懂得搜索引擎吗?要知道他们自称的是SEO专家而不是网赚专家,

CUDA编程(二) CUDA初始化与核函数

CUDA编程(二) CUDA初始化与核函数 CUDA初始化 在上一次中已经说过了,CUDA安装成功之后,新建一个工程还是十分简单的,直接在新建项目的时候选择NVIDIA CUDA项目就可以了,我们先新建一个MyCudaTest 工程,删掉自带的示例kernel.cu,然后新建项,新建一个CUDA C/C++ File ,我们首先看一下如何初始化CUDA,因此我命名为InitCuda.cu 首先我们要使用CUDA的RunTime API 所以 我们需要include cuda_runtime.h

iOS网络编程之二——NSURLSession的简单使用

iOS网络编程之二--NSURLSession的简单使用 一.NSURLSession简介     在iOS7之后,NSURLSession作为系统推荐使用的HTTP请求框架,在进行前台请求的情况下,NSURLSession与NSURLConnection并无太大差异,对于后台的请求,NSURLSession更加灵活的优势就将展现无遗.         1.NSURLSession集合的类型         NSURLSession类提供3中Session类型:         Default类

iOS多线程编程之二——NSOperation与NSOperationQueue

iOS多线程编程之二--NSOperation与NSOperationQueue 一.NSOperation解析 NSOperation是基于Object-C封装的一套管理与执行线程操作的类.这个类是一个抽象类,通常情况下,我们会使用NSInvocationOperation和NSBlockOperation这两个子类进行多线程的开发,当然我们也可以写继承于NSOperation的类,封装我们自己的操作类. 1.NSOperation抽象类中提供的逻辑方法 操作开始执行 ? 1 - (void)