65.9K
CodeProject 正在变化。 阅读更多。
Home

SOAP Web Services:一次创建,随处消费

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (70投票s)

2010年7月15日

CPOL

8分钟阅读

viewsIcon

380165

downloadIcon

17

详细介绍了简单的 ASP.NET Web 服务的开发,以及配置 IIS 服务器来托管服务,最后创建了 ASP.NET、Java 和 PHP Web 客户端来消费该服务。

引言

本教程旨在提供一个关于 Web 服务的实用入门介绍,因为它们在软件工程中的重要性日益增加。简而言之,Web 服务允许客户端远程执行某些方法,从而无需下载单独的 API。客户端和服务器之间的通信媒介是符合 SOAP 协议的 XML 消息。XML 的使用允许运行不同操作系统和编程语言的系统通过将 XML 请求和响应转换为其对应的语言等效项来进行通信。幸运的是,像 C#(或任何 .NET 语言)、Java、PHP 等编程语言都为客户端和服务器提供了抽象层,称为代理,从而消除了解析 XML SOAP 消息的需要。在本教程中,我将向您展示如何在 ASP.NET 中创建 Web 服务,以及如何将其注册到 IIS 服务器 7.0 中;最后,我将通过开发三个分别在 ASP.NET、Java 和 PHP 中消费此服务的客户端应用程序来演示 Web 服务的语言无关性。

创建 ASP.NET Web 服务

启动 Visual Studio,然后转到 文件 / 新建 / 网站...

选择 ASP.NET Web 服务作为模板,并将项目命名为:Server

在此项目中,我将使用 C:\Project7 作为我的默认文件夹。

转到 Service.cs 文件,通过替换来创建所需的四个方法

[WebMethod]
public string HelloWorld() {
return "Hello World";

[[WebMethod]
    public int Add(int x, int y)
    {
        return x + y;
    }
    [WebMethod]
    public int Subtract(int x, int y)
    {
        return x - y;
    }
    [WebMethod]
    public int Multiply(int x, int y)
    {
        return x * y;
    }
    [WebMethod]
    public int Division(int x, int y)
    {
        return x / y;
    }

请注意,[WebMethod] 标签允许方法被外部客户端访问。现在替换代码

[WebService(Namespace = "http://tempuri.org/")]

[WebService(Namespace="http://tempuri.org/",
Description="A Simple Web Calculator Service",
Name="CalculatorWebService")]

Description 属性为外部客户端提供了服务的简要描述;Name 属性允许外部客户端将服务称为 CalculatorWebService 而不是 Service

在 IIS 中安装 Web 服务

本项目使用运行在 Windows 7 PC 上的 IIS Server 7.0。

通过以下方式激活 IIS 服务器:

开始菜单 / 输入 IIS 在搜索栏 / Internet Information Services (IIS) Manager (Internet Information Services (IIS) 管理器)

或通过:控制面板 / 管理工具 / Internet Information Services (IIS) Manager (Internet Information Services (IIS) 管理器)

如果您找不到 IIS,那么它可能没有安装,因此请参阅 附录 A 来了解如何在 Windows 7 中激活此程序。

展开 Sites 树,然后右键单击 Default Web Site,并选择 Add Virtual Directory(添加虚拟目录)。

在 Alias(别名)字段中输入 WebService,在 Physical path(物理路径)字段中输入 C:\Project7\Server

单击 WebService 文件夹,然后切换 IIS 到 Content View(内容视图),以便看到 Service.asmxweb.config 文件。

由于我们手动创建了 WebService 虚拟目录,而没有使用 Visual Studio 测试模式,因此您应该右键单击 WebService 文件夹,选择 Convert to Application(转换为应用程序),然后单击 OK(确定)。

现在打开浏览器并访问 https:///WebService/Service.asmx,您应该会看到一个类似于此的屏幕

注意:如果您没有看到此屏幕,那么 IIS 服务器可能配置不当,请参阅 附录 B 了解如何首次配置 IIS。

在服务器端测试 Web 服务

CalculatorWebService 页面上,您可以看到指向我们在 C# 中实现的 AddDivisionMultiplySubtract 方法的四个链接;单击其中任何一个链接都将带您到一个新页面,您可以在其中测试您的方法。

创建 ASP.NET Web 客户端

启动 Visual Studio,然后转到 文件 / 新建 / 网站...

选择 ASP.NET Web Site 作为模板,并将项目命名为 Client

创建一个类似于这样的 ASP.NET 页面界面

现在,让我们像这样将我们的 Web 服务添加为服务引用到我们的项目中

在解决方案资源管理器中右键单击项目 / 选择 Add Service Reference(添加服务引用)/ 在地址字段中输入 https:///WebService/Service.asmx / 单击 Go(转到)查看导入的函数 / 选择 ServiceReference 作为您的命名空间 / 单击 OK(确定)。

编辑您的 Default.aspx.cs 源文件,以添加 GetResult 方法,该方法以两个数字字符串和一个整数函数作为输入,该整数函数对应于我们需要进行的四种基本计算器运算。

private string GetResult(string firstNumber, string secondNumber, int function)
    {
        ServiceReference.CalculatorWebServiceSoapClient client = 
            new ServiceReference.CalculatorWebServiceSoapClient();
        int a, b;
        string result = null;

        erra.Text = "";
        errb.Text = "";

        if (!int.TryParse(firstNumber, out a))
        {
            erra.Text = "Must be a valid 32-bit integer!";
            return "";
        }

        if (!int.TryParse(secondNumber, out b))
        {
            errb.Text = "Must be a valid 32-bit integer!";
            return "";
        }

        try
        {
            switch (function)
            {
                case 0:
                    result = firstNumber + " + " + secondNumber + 
			" = " + client.Add(a, b);
                    break;
                case 1:
                    result = firstNumber + " - " + secondNumber + " = "
                    + client.Subtract(a, b);
                    break;
                case 2:
                    result = firstNumber + " * " + secondNumber + " = 
			" + client.Multiply(a, b);
                    break;
                case 3:
                    result = firstNumber + " / " +
                    secondNumber + " = " + client.Division(a, b);
                    break;
            }
        }
        catch (Exception e)
        {
            LabelResult.ForeColor = System.Drawing.Color.Red;
            result = "Cannot Divide by Zero!";
        }
        return result;
    }

请注意此语句

ServiceReference.CalculatorWebServiceSoapClient client = 
            new ServiceReference.CalculatorWebServiceSoapClient();

它允许客户端对象访问 Web 服务方法。ServiceReference 是您之前选择的 Web 服务的命名空间。CalculatorWebServiceSoapClient 建立与客户端的 SOAP 连接(即,在代理服务器和代理客户端之间以 SOAP XML 消息的形式发送请求和接收响应)。

最后,添加 Submit(提交)按钮的事件处理程序,使用以下代码访问您之前创建的 GetResult 方法。

protected void btnSubmit_Click(object sender, EventArgs e)
    {
        LabelResult.ForeColor = System.Drawing.Color.Black;
        LabelResult.Text = GetResult(TextBoxFirstNumber.Text,
        TextBoxSecondNumber.Text,
        DropDownList.SelectedIndex);
    }

在 IIS 服务器中安装 Web 客户端

现在您已准备好使用一个消耗此服务的小型 ASP 网页来利用 Web 服务。

在 IIS 中创建一个新的虚拟目录,并选择 WebClient 作为别名;选择文件夹 C:\Project7\Client 作为物理路径

就像您为 WebService 虚拟目录所做的那样,右键单击 WebClient 目录,选择 Convert to Application(转换为应用程序),然后单击 OK(确定)。

最后,在浏览器中输入 https:///WebClient/,您应该会看到下图

在 ASP.NET 客户端端测试 Web 服务

现在我们已成功安装了利用我们的计算器 Web 服务的客户端页面,我们仍然需要验证客户端结果。

在 Java 1.6 类中安装和测试 Web 客户端

无论我们是否了解实现 Web 服务的编程语言,我们都可以轻松地链接不同平台的应用程序。Web 服务向其客户端显示标准的 XML 页面,称为 WSDL,这让他们对它们实现的功能有所了解。例如,导航到 https:///WebService/Service.asmx?wsdl 将生成一个带有特殊元素的 XML 页面。能够阅读 WSDL 文档并找到诸如:typemessageportTypebindingservice 等元素至关重要,因为它会告诉客户端开发人员服务所托管的功能(而不是文档)。有关 WSDL 文档的更多信息,请访问 www.w3schools.com/wsdl/wsdl_documents.asp

对于 JAVA 1.6 开发人员来说,幸运的是存在 JAVA jax-ws 包,该包生成与 Web 服务器通信所需的代理类。

首先,让我们构建 C:\Project7\java_proj\webClient 中的 Java 项目。

所以,首先创建一个名为 cl.java 的新 Java 类。(确保您的当前目录是 C:\Project7\java_proj\webClient)。

现在,让我们通过在命令行中键入以下内容来运行 jax-ws 工具

C:\Project7\java_proj\webClient >wsimport -keep -p webPack.serv 
https:///Service.asmx?wsdl 

wsimport 命令将生成我们所需的代理类,-keep 保留生成的源文件,而 webPack.serv 是包含代理类的包。您可以通过检查 WSDL 文件的service 部分并浏览 webPack\serv 文件夹来看到,我们拥有 CalculatorWebServiceCalculatorWebServiceSoap 这两个主要类。

接下来,让我们像这样编辑我们的 cl.java 客户端

import webPack.serv.*;

public class cl
{
	public static void main(String[] args)
	{
		CalculatorWebService service = new CalculatorWebService ();
CalculatorWebServiceSoap soap = service.getPort(CalculatorWebServiceSoap.class);
		int x = 5,y = 10;
		System.out.println(soap.Add(x,y));
		
	}
}

getPort 方法返回 CalculatorWebService 类根据 Web 服务定义的“存根”,并允许您访问定义的四个计算器方法。例如,soap.Add(int,int) 方法实际上会调用服务器来执行其中定义的 Add 函数,然后将返回值定向到客户端。

测试此类的代码很简单,只需像这样编译

>javac –classpath . cl.java 

然后像这样运行程序

> java cl 

您将获得“15”作为输出。

在 PHP 中安装和测试 Web 客户端

PHP 通过 NuSOAP 工具包允许轻松创建和消费基于 SOAP 的 Web 服务。要了解如何下载和配置此 API 工具包,请访问 http://sourceforge.net/projects/nusoap/
首先,您需要包含 nusoap 库,所以在 PHP shell 中键入

require_once('nusoap.php'); 

然后您需要连接到我们的 Web 服务的 WSDL 以生成 SOAP 客户端,所以键入

$wsdl="https:///WebService/Service.asmx?wsdl";
$client=new soapclient($wsdl, 'wsdl');

现在 SOAP $client 已准备好,我们可以简单地键入

$param=array(
'x'=>10,
'y'=>5
); 
echo $client->call('add', $param);

并且正如预期的那样,我们将得到“15”。

实际上,在 PHP/NuSOAP 中访问 Web 服务的方式与 .NET Framework 中非常相似。

附录 A:在 Windows 7 中激活 IIS 服务器和 ASP.NET

在大多数 Windows 计算机上,IIS 服务器和 ASP.NET 默认未安装,因为它们是可选的 Windows 组件;但是,安装过程如下所示,非常顺利。

转到控制面板并选择程序和功能(您可能需要单击查看方式:大图标才能看到程序和功能图标)。

在“程序和功能”窗口的左侧边距,选择打开或关闭 Windows 功能,您可能需要管理员权限才能继续。

接下来,展开 Internet Information Services 树以确保 IIS 服务器已安装。然后展开 World Wide Web Services 树,然后展开应用程序开发功能,并确保 ASP.NET 节点图标已选中。

最后单击 OK(确定)以安装 IIS 和 ASP.NET 服务器。

附录 B:首次使用 IIS 服务器的配置

要启动 Windows 7 下的 IIS 服务器,请转到开始菜单并键入 IIS - 您应该会看到Internet Information Services (IIS) Manager(Internet Information Services (IIS) 管理器)。

首先,您应该启动 IIS 服务器,所以单击右侧边距标有Action(操作)的 Start(启动)。

现在 IIS 服务器已启动,您可能(可选地)希望启用目录列表,以便允许用户浏览您的 Web 服务器的内容。

为此,请单击左侧边距的 Connections(连接)中的 Default Web Site 树,然后双击屏幕中间的 Directory Browsing(目录浏览)图标。在操作的右侧边距单击启用

现在您已准备好查看您的网站。只需启动浏览器并在浏览器中键入 https://。

结论

希望您现在了解 Web 服务的重要性及其在促进不同系统运行不同编程语言之间的分布式计算概念中的作用。如果您有兴趣在您的应用程序中使用一些免费提供的 Web 服务,请访问 www.webservicex.net/WS/wscatlist.aspx 以获取更多信息。

© . All rights reserved.