Web 服务 - 示例
基于 Web 服务架构,我们创建以下两个组件作为 Web 服务实现的一部分 -
服务提供商或出版商
这是网络服务的提供商。服务提供商实施服务并使其在 Internet 或 Intranet 上可用。
我们将使用 .NET SDK 编写并发布一个简单的 Web 服务。
服务请求者或消费者
这是网络服务的任何消费者。请求者通过打开网络连接并发送 XML 请求来利用现有的 Web 服务。
我们还将编写两个 Web 服务请求程序:一个基于 Web 的使用者(ASP.NET 应用程序)和另一个基于 Windows 应用程序的使用者。
下面给出的是我们的第一个 Web 服务示例,它作为服务提供者工作,并公开两个方法(add 和 SayHello)作为应用程序使用的 Web 服务。这是 Web 服务的标准模板。.NET Web 服务使用 .asmx 扩展名。请注意,公开为 Web 服务的方法具有 WebMethod 属性。将此文件另存为 IIS 虚拟目录中的 FirstService.asmx(如配置 IIS 中所述;例如,c:\MyWebSerces)。
FirstService.asmx <%@ WebService language = "C#" class = "FirstService" %> using System; using System.Web.Services; using System.Xml.Serialization; [WebService(Namespace = "http://localhost/MyWebServices/")] public class FirstService : WebService{ [WebMethod] public int Add(int a, int b) { return a + b; } [WebMethod] public String SayHello() { return "Hello World"; } }
要测试 Web 服务,必须将其发布。Web 服务可以发布到 Intranet 或 Internet 上。我们将在本地计算机上运行的 IIS 上发布此 Web 服务。让我们从配置 IIS 开始。
打开开始 → 设置 → 控制面板 → 管理工具 → Internet 服务管理器。
展开并右键单击默认网站;选择新建&#rarr; 虚拟目录。虚拟目录创建向导打开。点击下一步。
“虚拟目录别名”屏幕打开。输入虚拟目录名称。例如,MyWebServices。点击下一步。
“网站内容目录”屏幕打开。
输入虚拟目录的目录路径名。例如,c:\MyWebServices。点击下一步。
“访问权限”屏幕打开。根据您的要求更改设置。让我们保留本练习的默认设置。
单击下一步按钮。这样就完成了IIS的配置。
单击“完成”完成配置。
要测试 IIS 是否已正确配置,请在上面创建的虚拟目录 (C:\MyWebServices) 中复制 HTML 文件(例如 x.html)。现在,打开 Internet Explorer 并输入http://localhost/MyWebServices/x.html。它应该打开 x.html 文件。
注意- 如果不起作用,请尝试将 localhost 替换为您计算机的 IP 地址。如果还是不行,检查IIS是否正在运行;您可能需要重新配置 IIS 和虚拟目录。
要测试此 Web 服务,请将 FirstService.asmx 复制到上面创建的 IIS 虚拟目录 (C:\MyWebServices) 中。在 Internet Explorer 中打开 Web 服务 (http://localhost/MyWebServices/FirstService.asmx)。它应该打开您的网络服务页面。该页面应该包含指向我们的应用程序公开为 Web 服务的两个方法的链接。恭喜!您已经编写了您的第一个 Web 服务!
测试网络服务
正如我们刚刚看到的,在 .NET Framework 中编写 Web 服务非常容易。在 .NET 框架中编写 Web 服务消费者也很容易;然而,它涉及更多一些。如前所述,我们将编写两种类型的服务消费者,一种是基于 Web 的消费者,另一种是基于 Windows 应用程序的消费者。让我们编写第一个 Web 服务消费者。
基于Web的服务消费者
编写一个基于网络的消费者,如下所示。将其命名为 WebApp.aspx。请注意,它是一个 ASP.NET 应用程序。将其保存在 Web 服务的虚拟目录 (c:\MyWebServices\WebApp.axpx) 中。
该应用程序有两个文本字段,用于从要添加的用户获取号码。它有一个“执行”按钮,单击该按钮即可获取 Add 和 SayHello Web 服务。
WebApp.aspx <%@ Page Language = "C#" %> <script runat = "server"> void runSrvice_Click(Object sender, EventArgs e) { FirstService mySvc = new FirstService(); Label1.Text = mySvc.SayHello(); Label2.Text = mySvc.Add(Int32.Parse(txtNum1.Text), Int32.Parse(txtNum2.Text)).ToString(); } </script> <html> <head> </head> <body> <form runat = "server"> <p> <em>First Number to Add </em>: <asp:TextBox id = "txtNum1" runat = "server" Width = "43px">4< /asp:TextBox> </p> <p> <em>Second Number To Add </em>: <asp:TextBox id = "txtNum2" runat = "server" Width = "44px">5</asp:TextBox> </p> <p> <strong><u>Web Service Result -</u></strong> </p> <p> <em>Hello world Service</em> : <asp:Label id = "Label1" runat = "server" Font-Underline = "True">Label< /asp:Label> </p> <p> <em>Add Service</em> : & <asp:Label id = "Label2" runat = "server" Font-Underline = "True">Label</asp:Label> </p> <p align = "left"> <asp:Button id = "runSrvice" onclick = "runSrvice_Click" runat = "server" Text = "Execute"></asp:Button> </p> </form> </body> </html>
创建消费者之后,我们需要为要消费的Web服务创建代理。当引用已添加的 Web 服务时,Visual Studio .NET 会自动为我们完成这项工作。以下是应遵循的步骤 -
为要使用的 Web 服务创建代理。该代理是使用 .NET SDK 提供的 WSDL 实用程序创建的。该实用程序从 Web 服务中提取信息并创建代理。代理仅对特定的 Web 服务有效。如果您需要使用其他 Web 服务,您还需要为此服务创建代理。添加 Web 服务引用时,Visual Studio .NET 会自动为您创建代理。使用 .NET SDK 提供的 WSDL 实用程序为 Web 服务创建代理。它将在当前目录中创建 FirstSevice.cs 文件。我们需要编译它来为 Web 服务创建 FirstService.dll(代理)。
c:> WSDL http://localhost/MyWebServices/FirstService.asmx?WSDL c:> csc /t:library FirstService.cs
将编译好的代理放在Web Service虚拟目录的bin目录下(c:\MyWebServices\bin)。Internet 信息服务 (IIS) 在此目录中查找代理。
创建服务使用者,就像我们已经做的那样。请注意,Web 服务代理的对象是在使用者中实例化的。该代理负责与服务交互。
在 IE 中键入使用者的 URL 进行测试(例如,http://localhost/MyWebServices/WebApp.aspx)。
基于 Windows 应用程序的 Web 服务使用者
编写基于 Windows 应用程序的 Web 服务使用者与编写任何其他 Windows 应用程序相同。您只需要创建代理(我们已经完成)并在编译应用程序时引用该代理。以下是我们使用 Web 服务的 Windows 应用程序。该应用程序创建一个 Web 服务对象(当然是代理)并调用其上的 SayHello 和 Add 方法。
WinApp.cs using System; using System.IO; namespace SvcConsumer { class SvcEater { public static void Main(String[] args) { FirstService mySvc = new FirstService(); Console.WriteLine("Calling Hello World Service: " + mySvc.SayHello()); Console.WriteLine("Calling Add(2, 3) Service: " + mySvc.Add(2, 3).ToString()); } } }
使用 编译它c:\>csc /r:FirstService.dll WinApp.cs
。它将创建 WinApp.exe。运行它来测试应用程序和 Web 服务。
现在,问题来了:如何确定该应用程序实际上正在调用 Web 服务?
测试起来很简单。停止您的 Web 服务器,以便无法联系 Web 服务。现在,运行 WinApp 应用程序。它将引发运行时异常。现在,再次启动 Web 服务器。它应该有效。