创建代理访问.NET WebServices
这里我将说明如何在.NET中创建一个代理来访问.NET Web service。我还会生成并注册了一个可以在VB6中使用的代理组件。最后,我会给出在VB6中使用该代理的示例代码。
创建Web service
.NET为架设与访问Web services做了许多内部工作,因此我使用.NET来创建一个Web service。我依靠ASP.NET Web Matrix's Web Service Proxy Generator来生成程序代码(生成代码的作用是在.NET中访问Web Service)。在菜单的“Tools”选项中,选择“Web Service Proxy Generator”。要完成该步骤你必须输入的信息有WSDL URL,代理的命名空间,输出目录以及源代码文件的名称。WSDL URL只不过是你的.asmx Web service文件的URL。你可以选择任意的命名空间,不过最好保持其一致性。例如,我的命名空间被设置为MyWebServiceProxy,并使用UserServiceProxy.cs作为源文件的名称。考虑到我接下来将创建一个.NET工程并加入这个文件,我使用的输出目录与即将创建的工程所在目录一致(注意:不要生成汇编文件)。
开始创建工程
现在可以在in Visual Studio .NET中创建一个新的工程了。这个工程的输出类型应当被设置为Class Library工程。我将其我的工程命名为MyWebServiceProxy。在这个工程里,我加入了源文件UserServiceProxy.cs。此外,我还改变了这个类中的一些可见性声明。最后的代码与列表A中的类似。
列表A:
namespace MyWebServiceProxy {
using System.Diagnostics;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Services;
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="UserServiceSoap",
Namespace="http://tempuri.org/")]
public class UserService :
System.Web.Services.Protocols.SoapHttpClientProtocol {
public UserService() {
this.Url = "http://localhost/MyWebService/UserService.asmx";
}
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/
GetUser", RequestNamespace="http://tempuri.org/",
ResponseNamespace="http://tempuri.org/",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public User GetUser(intuserId) {
object[] results = this.Invoke("GetUser", new object[] {
userId});
return ((User)(results[0]));
}
private System.IAsyncResultBeginGetUser(intuserId,
System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetUser", new object[] {
userId}, callback, asyncState);
}
private User EndGetUser(System.IAsyncResultasyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((User)(results[0]));
}
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
public class User {
public string UserId;
public string FirstName;
public string LastName;
}
}
这里我将说明如何在.NET中创建一个代理来访问.NET Web service。我还会生成并注册了一个可以在VB6中使用的代理组件。最后,我会给出在VB6中使用该代理的示例代码。
接下来,按照以下的步骤:
在Project Explorer上点击鼠标右键,选择“Properties”。在“Configuration Properties | Build”标签栏,将“Register For COM Interop”选项设置为True。
为了生成这个工程,你要在VB6中创建一个新的Standard EXE工程。
为MyWebServiceProxy类型库添加一个引用。
在默认的窗体上,加入一个CommandButton控件。
在这个CommandButton控件的Click事件中,加入以下的代码:
IntelliSense为你提供了MyWebServiceProxy的公共类;但是,你还不能使用这些类的成员(比如,GetUser() 方法, 等等)。这并不意味着你不能使用它们。这仅仅表示你必须通过引用或者指针。你还可以通过实现一个接口来解决这个问题(这可能是一个更巧妙的解决方法,但是就这篇文章的目的而言,这样做没有必要)。
运行这段代码并查看你的运行结果。如果每个步骤都是正确完成的,你应该可以看到一个消息框,显示id为1的用户的名字与姓氏。
克服安全性障碍
你可以遇到的最大障碍就是安全性。如果你遇到一个“访问拒绝”错误,你会有两个选项。第一是模仿IIS中的匿名账户。在你的Web service中的web.config里,一定要加入Identity结点并将Impersonate属性设置为True。在Internet Services Manager中,改变你.asmx文件的安全属性。设置系统的匿名用户或者域用户以使其有足够的权限来访问Web service所必需的资源。如果这一切都失败了,就使用一个管理员账号来进行本次练习。再次运行代码并查看运行结果。
另外一个选项是在web.config文件的Identity结点里设置userName以及 password属性。同样,将其设置为一个权限合适的账号。另外,别忘了包含impersonate属性。