深入研究VB.Net远程调用对象的机制
来源:互联网
作者:西部数码
时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
在 VS.NET中创建一个新Windows应用程序项目并把它命名为 NETclient,添加一个NETserver集合的引用,并添加一个 Imports语句:
Imports NETserver
这个语句使你的客户应用程序可使用远程类,你现在可以添加一个按钮到窗体中,并写按钮的代码来调用对象:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim obj As New NETclass()
MsgBox(obj.GetName("238-95-7766"))
End Sub
最后,你需要配置远程服务。使用 NEThost应用程序中相同的代码来完成这个任务,添加一个 System.Runtime.Remoting.dll的引用并添加一句 Imports语句:
Imports System.Runtime.Remoting
在窗体的New方法中添加一行代码来配置远程服务:
RemotingServices.ConfigureRemoting("...cfg")
与主应用程序一样,你需要创建一个配置文件以便客户应用程序知道如何定位和联络主应用程序和你的远程对象。
这个配置文件也是一个简单的文本文件,就象主机配置文件。它也包含三行代码,使用井号(#)作为分隔符。第一行代码标识客户程序名称:
Name#NETclient
下面的这行代码标识你的远程对象集合:
Assembly#NETserver#NEThost#NETserver.NETclass=HTTP://localhost:8085/NETclass
在一行中输入所有的代码,项目中间不留空格。
你需要指定远程主应用程序的应用程序名和包含这个远程对象的集合的名称。然后提供这个远程类的完整类名和用户将访问的类的完整的URI。从你在主机配置文件中指定的 URI中得到这个 URI,并且指定通信协议(HTTP://)、主机(localhost)和端口(:8085)。
最后,你需要指出与主应用程序通信时使用的通道,这是你包含在主机配置文件中的相同的一行代码:
Channel#System.Runtime.Remoting#System.Runtime.Remoting.Channels.HTTP.HTTPChannel
在一行中输入所有的代码,项目中间不留空格。你必须在客户机和主机之间使用公共的通道;否则,它们就不能够通信。
第五节 配置客户端
就象主应用程序一样,你可以选择以编程方式配置客户应用程序而不是使用一个配置文件。然而,在beta 1中,在客户端上的改动并不像在服务器端上的改动那么容易,因为你还需要改变创建每一个对象实例的方法的代码。为了不使用New关键字来创建对象,你还需要使用Activator.GetObject方法。这利用了一个附带在客户机上的配置文件。
改变配置客户机的方法,只要把调用替换为ConfigureRemoting,如下所示:
Dim c As New Channels.HTTP.HTTPChannel()
ChannelServices.RegisterChannel(c)
这两行代码配置 HTTP通道,以便为使用它做好准备。然后你必须搜寻客户应用程序,找到使用 New关键字创建远程对象的代码:
obj = New NETclass()
使用这个语句替换前面的那一行语句:
obj = CType(Activator.GetObject (GetType(NETserver.NETclass), _
"http://localhost:8085/NETclass"), NETclass)
这行语句很复杂,它调用GetObject方法从指定URI取得一个 NETserver.NETclass类型的对象。然后使用CType函数把得到的结果对象强制转换成 NETclass类型以便你可以在你的代码中使用它。
你的客户机代码剩余部分就可以保持不变了,如果你决定使用编程配置你的客户应用程序,我推荐在一个函数中封装对象的创建过程,如下:
Private Function NewNETclass() As NETclass
Return CType(Activator.GetObject( GetType(NETserver.NETclass),_
"http://ineroth:8085/NETclass") , NETclass)
End Function
然后,当你想得到这个对象的一个引用的话,你可以使用这个函数:
obj = NewNETclass()
虽然这还不象使用 New关键字那么简单,它还是封装代码来创建远程对象。
远程程序很难调试,这是因为你的客户应用程序有到你的远程程序直接的引用,当远程程序失败时而你的客户机看上去仍然在工作。这是因为如果远程调用过程失败的话,客户机就会试图调用对象的局部拷贝。
你可以证明在这个函数返回它的值之前,通过在NETclass中添加一行代码调用远程对象来打印一则信息到控制台窗口:
Console.WriteLine("Returning " & CStr(dr.Item("au_lname"))_
& ", " & CStr(dr.Item("au_fname")))
现在,在你的主应用程序运行的服务器控制台窗口中,当它被调用时这个功能显示一则信息。当你运行客户应用程序时转换到控制台窗口并保证它显示这则信息。事实上,这证明你正在与远程对象交互。
如果你在连接远程对象时遇到了麻烦,你可以通过使用浏览程序来测试这个主应用程序。在一个控制台窗口中运行这个主应用程序,然后打开 Internet Explorer并且定位到这个远程对象的 URI。在我的例子中,你将定位到这个 URI:
http://localhost:8085/NETclass
如果主机正确操作,你应该看作为显示为一个页面或 XML的远程对象的SOAP定义(参见图3)。如果你没有看,主机可能就没能正确配置。

你可以使用远程调用来创建 N层应用程序,只要通过调用 Active Server Pages ( ASP.NET )或者来自 VB.NET客户端应用程序中的 remote组件。 你也可以通过把 NEThost放进 Windows 2000 Service Application中,来增强这个例子的功能。因为那样的话,服务器在这台机器运行的任何时候都可用。你还可以使用它从一个数据库中返回数据,或者执行其他需要的服务器端处理过程。 你还可以使用 ASP.NET页面或者 VB.NET Windows应用程序来替换本文中的简单的例子,这样你就可以向你的用户显示你丰富的才华了。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



