上面讨论了如何创建Web服务,接下来就讨论如何使用它们。为此需要在代码中生成一个知道如何与给定Web服务进行通信的代理类。这样,代码中对Web服务进行的任何调用都要通过这个代理类,从表面看,这个代理类就等同于Web服务,代码也会认为我们有了Web服务的本地副本。而实际的情况是有许多HTTP通信工作在进行,只是我们感觉不到其中的细节。有两种方式可以完成这项任务:第一,可以使用WSDL.exe命令行工具;第二,可以使用VS.NET中的Add Web Reference菜单选项。
在命令行上使用WSDL.exe时,它会根据Web服务的WSDL描述生成一个包含代理类的.cs文件。使用Web服务的URL来指定该文件,例如:
WSDL http://localhost/PCSWebSrv1/Service1.asmx?WSDL
这样就会在Service1.cs文件中为上一小节中的示例生成一个代理类。这个代理类将以Web服务命名,在这个示例中就是Service1,该代理类包含一些方法,那些方法将可以调用相同名称的服务方法。在使用这个类时,只需把所生成的.cs文件添加到项目中,使用下面的代码就可以了:
Service1 myService = new Service1();
String result = myService.CanWeFixIt();
默认状态下,生成的类将放在根命名空间中,因此不需要使用using语句,但是,可以使用WSDL.exe命令行选项/n:<namespace>指定一个不同的命名空间。
这项技术按说应该不错了,但是,如果服务正处于开发或处于连续变动中,就比较费事了。当然,为了在每次编译之前自动更新所生成的代理类,这项技术可以用项目的构建选项来执行,但是我们有更好的方法。
下面在一个新的Web应用程序PCWebClient1中,为上一小节中的示例创建客户,来阐明这个更好的方法。现在创建这个新项目,在生成的.aspx页面中,用下面的代码替换现有的form声明:
<form method="post" runat="server">
<asp:Label Runat="server" ID="resultLabel"/><br>
<asp:Button Runat="server" ID="triggerButton"
Text="Invoke CanWeFixIt()"/>
</form>
接下来将把单击按钮事件处理程序与Web服务绑定起来。首先需要在项目中添加对Web服务的引用。其方法是:右击Solution Explorer中的新客户项目,选择Add Web Reference选项。然后,在出现的窗口中键入Web服务文件Service1.asmx的URL,或者使用本地机器链接中的Web服务,自动查找它,如图26-3所示。
图 26-3
接着,可以使用Add Reference按钮添加引用。但应先把Web引用的默认内容从localhost改为myWebService。现在单击Add Reference按钮,在Solution Explorer中把myWebService添加到项目的Web References部分,在Solution Explorer中显示隐藏的文件时,可以看到文件Reference.map、Reference.cs、Service1.disco和Service1.wsdl已添加到项目中。
Web引用名称myWebService也是使用代理类时需要引用的命名空间,在WebForm1.aspx.cs的代码中添加下面的using语句:
using PCSWebClient1.myWebService;
现在就可以在类中使用服务了,而不必提供服务的完全限定名称。
使用下面的代码把事件处理程序添加给窗体上的按钮(双击该按钮):
private void triggerButton_Click(object sender, System.EventArgs e)
{
Service1 myService = new Service1();
resultLabel.Text = myService.CanWeFixIt();
}
运行应用程序并且单击按钮,浏览器窗口中将显示CanWeFixIt()的执行结果。
以后这个Web服务也许会改变,但是,使用这个方法,可以简单地右击Server Explorer中的Web Reference文件夹,并选择Update Web Reference,生成一个新的代理类,以供使用。