当前位置:编程学习 > VB >>

深入研究VB.Net远程调用对象机制(1)

 

 

第一节 引言

 

  在.NET出现以前,COM和DCOM可以让你很容易地用运行在另一进程或者网络上另一台机器上的对象来进行交互作用。然而现在,.NET结构提供一种与之不同的机制--远程调用,用于在你的客户应用程序和远程对象之间的内部处理和LAN通讯。在本文中,我将介绍如何通过在Visual Basic.NET(VB.NET)中创建一个类库来使用远程对象,调用来自于另一进程或者网络上另一台机器的方法的客户端应用程序。如图

 

 

     (图001)

 

  你仍然可以在VB.NET中使用COM和DCOM,VB.NET支持一个交互机理,你可以用来在COM组件中调用来自.NET的代码。然而,这个机制是为了能够继承以前的系统支持而设计的而不是为了新技术开发的,所以你应该着眼于更多现在新的技术。

 

  另外一个替代的机制就是使用Web服务调用远程对象,当你使用 Web服务时,你不能进行一个对象的相同的实例的一个以上的方法调用,一个新对象实例服务每次只能调用一个。使用Web服务还要求你在对象运行的机器上安装Internet Information Server ( IIS ),但是你需要的可能是一种不需要安装IIS的轻量级解决方案。

 

  远程调用是最类似于DCOM的.NET中的技术。在Beta 1版中,.NET远程调用比 DCOM需要更多的准备工作,但是它是一种简单的后台技术,并且承诺当.NET正式版本发布的时候会更加容易。你可以在相同的机器上的一个单独的进程中使用远程调用激活对象,或通过网络激活运行在另外一台机器上的对象。使用远程调用,你可以进行对象的相同的实例上的更多的方法调用,或者你可以配置远程调用象 Web服务那样动作,并且为每一个方法调用创建新的对象实例。

 

  为了使用远程调用工作,你需要安装.NET Framework SDK,并最好安装集成Visual Studio.NET(VS.NET)。让我们在单独的一台机器上开始测试,在一个来自客户端应用程序中的单独的进程中运行物体的远程调用过程,然后把这个对象的远程调用过程移到网络上的另外一台机器上。

 

  第二节 了解简单的远程调用

 

  虽然你可以使用远程调用来填补曾由DCOM来满足的市场,但是远程调用与DCOM不同,远程调用使用一个你选择的网络接口,而DCOM不同,它使用许多难以预测的网络接口来与你的对象通讯,这使得远程调用在大多数的环境中可以很容易的配置。

 

  当你调用一个使用远程调用的对象时,你通过一个通道进行调用过程:这个远程调用通讯机制与在网络上的对象通讯。你可以选择两个不同的通道甚至还可以创建你自己的通道。.NET中提供的两个通道是HTTP通道和一个直接的 TCP socket通道,你使用这些通道中的一个(即使你可能在同一台机器上)激活一个对象。

 

  如果你使用 HTTP通道,你就得使用HTTP协议和简单对象访问协议(SOAP)与远程调用对象通讯,即使你使用 HTTP,你也未必非得使用端口80,虽然这是Web服务器默认的端口,你可以指定任意端口号作为通信端口。

 

  直接的 TCP socket通道也是类似的,如果你选择这个通道,所有的通信就使用一个专有协议和一个SOAP的二进制实现来完成。虽然说这有些不好的地方,但是它多多少少能够快一些,因为把数据编码成二进制格式的过程比使用SOAP效率更加高,因为它是基于XML的。

 

  每次你的代码调用远程调用对象的一个方法,远程调用子系统把这个方法调用转换成一条并把它通过选定的通道发送到远程调用对象中去。远程调用子系统然后再把这个方法的返回结果转换成一条消息返回到客户端应用程序中。在 beta 1中,使用一个单独的" black box "远程调用组件处理这个过程,但是在以后将发布的.NET中,这个体系结构将更加开放,将提供更多的可延伸性和可控制性。

 

  和 DCOM一样,远程调用对象必须在一个过程中运行。因为 Microsoft Transaction Server ( MTS )和 COM+都不是特意支持 .NET,所以你需要在服务器上实现你自己的主机应用程序来。 你的主机应用程序使用远程调用服务来在消息通道上监听。其实这比听起来要容易,因为远程调用为你考虑到所有的细节。 然而,远程调用调试起来可能会比较困难。 稍后我将讨论一些可以使调试变得更容易的技术。

 

第三节 创建并使用一个类

 

  在你能够通过网络调用一个对象之前,你必须有一个类库。所有的COM对象在你首次创建它们的过程中或者在机器中继续运行,在 VB.NET中,你可以使用<Serializable()>属性标记一个类,这样你的对象就是以字的方式发送,意思是说它是物理上被复制进入正在调用的应用程序过程中的。

 

  显然,如果你想要激活一个在另外一个过程或另外一台机器中的对象的方法,你想要那个对象支持远程调用。要想这样的话,你可以从.NET系统类库中的MarshalByRefClass类或MarshalByRefComponent类中取得你的对象,与使用值传递的标准System.Object基本类不同,你是通过引用传递这些基本类。你也应该避免使用<Serializable>属性标记这个对象,因为你有可能并不希望这个对象连续,而是在服务器中运行它。

 

  你可以创建一个简单的类库来检测外部远程调用,在 VS.NET集成环境中,创建一个新类库项目,取名为NETserver并把默认的 Class1.vb文件重命名为NETclass.vb。默认的情况下,这个类是从Component基本类中派生出来的,它是通过值传递的。你可以把 Inherits行改为通过引用传递你的类,把你的类改为MarshalByRefComponent的子类:

 

Public Class NETclass

补充:软件开发 , Vb ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,