WSDL教程:Web服务描述语言及示例

什么是 WSDL?

Web Services Description Language (WSDL) 是一种基于 XML 的文件,它基本上告诉客户端应用程序 Web 服务的功能。WSDL 文件用于简要描述 Web 服务的功能,并为客户端提供连接到 Web 服务并使用 Web 服务提供的所有功能所需的所有信息。

在本教程中,我们将重点关注最后一点,这是 Web 服务最重要的部分,即 WSDL 或 Web 服务描述语言。

WSDL 文件用于简要描述 Web 服务的功能,并为客户端提供连接到 Web 服务并使用 Web 服务提供的所有功能所需的所有信息。

WSDL 文档结构

WSDL 文档用于描述 Web 服务。此描述是必需的,以便客户端应用程序能够理解 Web 服务实际执行的操作。

  • WSDL 文件包含 Web 服务的地址,并且
  • Web 服务公开的方法。

WSDL 文件本身对任何用户来说都可能非常复杂,但它包含了任何客户端应用程序使用相关 Web 服务所需的全部必要信息。

下面是 WSDL 文件的通用结构

  • 定义
  • TargetNamespace
  • DataTypes
  • 消息
  • Porttype
  • Bindings
  • service

这里需要注意的一点是,消息的定义,也就是 SOAP 协议 传输的内容,实际上是在 WSDL 文档中定义的。

WSDL 文档实际上告诉客户端应用程序 Web 服务发送和接受的 SOAP 消息的类型。

换句话说,WSDL 就像一张明信片,上面有一个特定地点的地址。地址提供了递送明信片的人的详细信息。因此,同样地,WSDL 文件就是明信片,上面有 Web 服务的地址,可以提供客户端想要的所有功能。

<!-- WSDL definition structure -->
<definitions     
		name="Guru99Service"
        targetNamespace=http://example.org/math/
        xmlns=http://schemas.xmlsoap.org/wsdl/>   
	<!-- abstract definitions -->   
		<types> ...    
			<message> ...   
			<portType> ...

   <!-- concrete definitions -->  
		<binding> ...   
		<service> ...
</definition>

下面是 WSDL 文件结构图

Structure of a WSDL Document
WSDL 结构

WSDL 元素

WSDL 文件包含以下主要部分

  1. <types> 标签用于定义在客户端应用程序和 Web 服务之间交换的消息中使用的所有复杂数据类型。这是客户端应用程序的一个重要方面,因为如果 Web 服务处理的是复杂数据类型,那么客户端应用程序应该知道如何处理该复杂数据类型。float、数字和字符串等数据类型都是简单数据类型,但 Web 服务可能提供结构化数据类型。
    例如,可能有一个名为 EmployeeDataType 的数据类型,其中包含两个元素:“EmployeeName”(类型为字符串)和“EmployeeID”(类型为数字或整数)。它们共同构成一个数据结构,然后该数据结构成为复杂数据类型。
  2. <messages> 标签用于定义在客户端应用程序和 Web 服务器之间交换的消息。这些消息将解释 Web 服务可以执行的输入和输出操作。消息的示例可以是接受员工 ID 的消息,输出消息可以是基于提供的员工 ID 的员工姓名。
  3. <portType> 标签用于将每个输入和输出消息封装到一个逻辑操作中。因此,可以有一个名为“GetEmployee”的操作,该操作结合了从客户端应用程序接收员工 ID 的输入消息,然后将员工姓名作为输出消息发送。
  4. <binding> 标签用于将操作绑定到特定的端口类型。这样,当客户端应用程序调用相关端口类型时,它将能够访问绑定到此端口类型的操作。端口类型就像接口一样。因此,如果客户端应用程序需要使用 Web 服务,它们需要使用绑定信息来确保它们能够连接到 Web 服务提供的接口。
  5. <service> 标签是为 Web 服务本身提供的名称。最初,当客户端应用程序调用 Web 服务时,它将通过调用 Web 服务的名称来完成。例如,Web 服务可以位于地址 https:///Guru99/Tutorial.asmx。Service 标签将实际定义 URL 为 https:///Guru99/Tutorial.asmx,这将实际告诉客户端应用程序在此位置有一个可用的 Web 服务。

为什么需要 WSDL

Web 服务是构建现代 Web 应用程序的重要组成部分。它们的主要目的是允许用不同编程语言构建的多个应用程序相互通信。例如,我们可以有一个 .Net Web 应用程序通过 Web 服务与 Java 应用程序通信。

Web 服务具有以下关键特性:

  • 它使用 XML 编程语言构建。几乎所有现代技术,如 .Net 和 Java,都有相应的命令能够处理 XML。因此,XML 被认为是构建 Web 服务最合适的语言。
  • Web 服务通过 HTTP 进行通信。HTTP 是所有基于 Web 的应用程序使用的协议。因此,确保 Web 服务也能够通过 HTTP 协议工作是有道理的。
  • Web 服务符合特定的语言规范。该规范由 W3C 设定,W3C 是所有 Web 标准的管理机构。
  • Web 服务具有一种称为 WSDL 的描述语言,用于描述 Web 服务。

WSDL 文件是用纯 XML 编写的。之所以使用 XML,是为了让任何编程语言都能读取该文件。

因此,如果客户端应用程序是用 .Net 编写的,它将能够理解 XML 文件。同样,如果客户端应用程序是用 Java 编程语言编写的,它也能解释 WSDL 文件。

Need WSDL

WSDL 文件是将所有内容绑定在一起的内容。从上面的图可以看出,您可以用 .Net 语言创建 Web 服务。

这就是服务实现的地方。如果您没有 WSDL 文件并且想让 Java 类使用 Web 服务,那么您需要大量的编码工作才能实现这一点。

但是现在有了 WSDL 文件,它是 XML 格式的,任何编程语言都可以理解,您现在可以轻松地让 Java 类使用 .Net Web 服务。因此,编码工作量大大减少。

WSDL 消息部分

WSDL 由一个称为“messages”的部分组成,用 <message> 元素表示。

此元素基本上用于描述在 Web 服务和客户端应用程序之间交换的数据。

每个 Web 服务将始终有 2 种消息:

  • 一种用于 Web 服务的输入,另一种用于 Web 服务的输出。
  • 输入用于描述 Web 服务接受的参数。这是客户端应用程序的一个重要方面,以便它知道要作为参数发送到 Web 的值。
  • 另一种消息是输出消息,它说明 Web 服务提供的结果。

每个消息反过来又有一个 <part> 元素,用于描述输入和输出消息使用的参数。

下面是一个简单的例子,说明 Web 服务的消息是什么样的。Web 服务的功能是在提交“教程 ID”作为参数后提供“教程”的名称。

WSDL Message Part

  1. 如我们所见,Web 服务有 2 条消息,一条用于输入,另一条用于输出。
  2. 输入消息称为 TutorialNameRequest,它有一个名为 TutorialID 的参数。此参数的类型是数字,由 xsd:number 类型指定。
  3. 输出消息称为 TutorialNameResponse,它有一个名为 TutorialName 的参数。此参数的类型是字符串,由 xsd:string 类型指定。

端口类型绑定

端口用于 WSDL 定义 Web 服务提供的一个完整操作。

在上一主题中,我们看到我们的 Web 服务提供了 2 条消息,一条用于输入(称为“TutorialNameRequest”),另一条用于输出(称为“TutorialNameResponse”)。输入和输出消息一起构成一个完整的操作。

WSDL 提供了一个称为 <portType> 的元素,用于定义 Web 服务提供的操作。

Port Type Binding

因此,在我们上面的例子中,我们可以注意到以下几点:

  1. 封装操作的端口类型的名称为“Tutorial_PortType”。
  2. 操作本身被命名为“Tutorial”。因此,我们的操作基本上会在输入参数为 TutorialID 时提供 TutorialName。
  3. 接下来是我们的 2 条消息,一条用于输入,一条用于输出,它们构成了我们的操作。

除了 <portType> 元素之外,还有一个 <binding> 元素,用于定义消息如何传输。

Port Type Binding

  1. 上面的示例表明,绑定包含一个绑定名称,在我们的例子中是“TutorialSoapBinding”。简单来说,绑定是客户端应用程序用于实际绑定到 Web 服务的信息。一旦它实际绑定到 Web 服务,它就可以调用 Web 服务公开的各种操作。
  2. 传输层是 http://,这意味着消息将通过 HTTP 协议传输。

创建 WSDL 文件

每当使用任何编程语言构建 Web 服务时,就会创建 WSDL 文件。

由于 WSDL 文件本身生成起来相当复杂,因此所有编辑器,如 .Net 的 Visual Studio 和 Java 的 Eclipse,都会自动创建 WSDL 文件。

下面是在 Visual Studio 中创建的 WSDL 文件示例。

<?xml version="1.0"?>
<definitions name="Tutorial"             
		targetNamespace=http://Guru99.com/Tutorial.wsdl           
        xmlns:tns=http://Guru99.com/Tutorial.wsdl            
        xmlns:xsd1=http://Guru99.com/Tutorial.xsd           
        xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/
        xmlns="http://schemas.xmlsoap.org/wsdl/"> 
   <types>    
   		<schema targetNamespace=http://Guru99.com/Tutorial.xsd    
        xmlns="http://www.w3.org/2000/10/XMLSchema">
        
        <element name="TutorialNameRequest">       
        	<complexType>         
            	<all>            
                	<element name="TutorialName" type="string"/>        
                </all>      
            </complexType>     
       </element>    
       <element name="TutorialIDRequest">       
       		<complexType>           
            	<all>           
                	<element name="TutorialID" type="number"/>         
                </all>      
            </complexType>     
       </element>    
    </schema>
 </types>  
 <message name="GetTutorialNameInput">   
 	<part name="body" element="xsd1:TutorialIDRequest"/>  
 </message> 
 <message name="GetTutorialNameOutput">  
 	<part name="body" element="xsd1:TutorialNameRequest"/>
 </message> 
 <portType name="TutorialPortType">  
 	<operation name="GetTutorialName">    
    	<input message="tns:GetTutorialNameInput"/>     
        <output message="tns:GetTutorialNameOutput"/>   
    </operation>  
  </portType> 
  <binding name="TutorialSoapBinding" type="tns:TutorialPortType">  
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>  
 	 <operation name="GetTutorialName">    
  		<soap:operation soapAction="http://Guru99.com/GetTutorialName"/>   
        	<input>   
            	<soap:body use="literal"/>   
            </input>  
        <output>      
   <soap:body use="literal"/>   
 </output>   
 </operation>  
 </binding>  
 
 <service name="TutorialService">   
 	<documentation>TutorialService</documentation>  
    <port name="TutorialPort" binding="tns:TutorialSoapBinding">     
    	<soap:address location="http://Guru99.com/Tutorial"/>
    </port>
 </service>
</definitions>

上面的 WSDL 文件看起来会让任何用户感到畏惧,我们将在后续教程中详细介绍各个部分,但现在,让我们对 WSDL 文件的每个部分的作用进行一个概要性的了解。

发布 Web 服务示例

现在让我们来看一个示例,说明如何使用 Visual Studio 发布 Web 服务并消耗它。

在本示例中,我们将创建一个包含一个 WebMethod 的 Web 服务。此方法将接受一个名为“TutorialID”的整数参数。然后,该 Web 方法将返回一个名为“Web Services”的字符串。

然后,我们将创建一个基于控制台的应用程序,该应用程序将消耗此 Web 服务并相应地调用我们的 Web 方法。

让我们看看执行此示例所需的步骤。

步骤 1) 第一步是创建您的 Web 服务。如何创建 Asp.Net Web 项目和 Web 服务的详细步骤已在此处解释;请遵循相同的步骤来创建项目和 Web 服务。关键部分是将以下代码输入到 Web 服务文件中。

Publishing the Web Service Example

namespace webservic asmx
{
	[WebService(Name = "Guru99 Web service")]
	public class TutorialService : System.Web.Services.WebService
	{
		[WebMethod]
		public string GetTutorialService(int TutoriallD)
		{
			string TutorialName = "Web Services";
			return TutorialName;
		}
	}
}

代码解释

  1. 这里我们创建了一个名为“Guru99WebService”的 WebMethod。在此 WebMethod 中,我们包含一个整数参数,该参数在每次调用此 WebMethod 时都需要传递。
  2. 接下来,我们定义一个名为“TutorialName”的变量,该变量将保存“Web Services”的字符串值。这是调用 Web 服务时将返回的值。

步骤 2) 定义完 Web 服务文件后,下一步是创建一个将消耗此 Web 服务的客户端项目。

让我们创建一个简单的控制台应用程序,该应用程序将调用此 Web 服务,调用“Guru99WebService”,然后将 Web 方法的输出显示在控制台日志屏幕上。请按照以下步骤创建控制台应用程序。

右键单击 Visual Studio 解决方案文件,然后选择“添加”->“新建项目”选项。

Publishing the Web Service Example

步骤 3) 在此步骤中,

  1. 确保首先选择 Visual C# Windows 选项。然后选择创建控制台应用程序的选项。
  2. 为您的项目命名,在本例中为“DemoApplication”。

Publishing the Web Service Example

单击上一个屏幕上的“确定”按钮后,您将在 Visual Studio 的解决方案资源管理器中看到该项目。

Publishing the Web Service Example

步骤 4) 在此步骤中,您将设置 DemoApplication 控制台应用程序为启动项目。这样做是为了确保在运行整个 Visual Studio 项目时,此应用程序首先启动。此控制台应用程序反过来将调用 Visual Studio 自动启动的 Web 服务。

要完成此步骤,请右键单击 DemoApplication 项目并选择“设置为启动项目”选项。

Publishing the Web Service Example

步骤 5) 下一步是为我们的控制台应用程序添加“Guru99Webservice”的服务引用。这样做是为了让 DemoApplication 能够引用 Web 服务以及 Web 服务中的所有 Web 方法。

为此,请右键单击 DemoApplication 项目文件并选择菜单选项“添加”->“服务引用”。

Publishing the Web Service Example

步骤 6) 在此步骤中,我们将提供添加服务引用所需的各种值。

  1. 首先,我们需要选择我们的发现选项。此选项将自动获取 TutorialService Web 服务的 WSDL 文件。
  2. 接下来,我们应该为我们的服务引用命名。在本例中,我们将其命名为 Guru99Webservice。
  3. 然后,我们需要展开 TutorialService.asmx 选项,以便能够看到右侧的“GetTutorialService”方法。这里 TutorialService.asmx 是我们的 Visual Studio .Net 文件名,其中包含我们 Web 服务的代码。
  4. 然后我们将看到我们在 Web 服务中拥有的 Web 方法,称为“GetTutorialService”。

Publishing the Web Service Example

当单击“确定”按钮时,访问此 Web 服务所需的所有代码将被添加到我们的 DemoApplication 控制台应用程序中,如下所示。

屏幕截图显示“Guru99Webservice”已成功添加到我们的控制台应用程序。

Publishing the Web Service Example

步骤 7) 下一步是向我们的控制台应用程序添加代码,以访问 Web 服务中的 Web 方法。打开控制台应用程序自动附带的 Program.cs 代码文件,并添加以下代码。

Publishing the Web Service Example

namespace DemoApplication
{
	class Program
	{
		static void Main(string[ ] args)
		{
			var client = new Guru99Webservice.Guru99WebserviceSoapClient();

			Console.WriteLine(client.GetTutorialService(l));
			
			Console.ReadKey();
		}
	}
}

代码解释:

  1. 第一部分是选择 Program.cs 文件。这是 Visual Studio 在创建控制台应用程序时创建的主文件。当控制台应用程序(在本例中为 DemoApplication)执行时,将执行此文件。
  2. 然后我们创建一个名为“client”的变量,它将被设置为我们先前步骤中创建的服务引用的实例。在本例中,服务引用为‘Guru99Webservice.Guru99WebserviveSoapClient()’。
  3. 然后我们调用 TutorialService Web 服务中的 WebMethod‘GetTutorialService’。请记住,我们的 GetTutorialService’ 方法接受一个整数参数,因此我们只向 Web 方法传递一个整数参数。
  4. 最后一行是为了确保控制台日志屏幕保持活动状态,以便我们可以查看输出。此命令将等待用户的输入。

输出

遵循以上所有步骤并运行 DemoApplication 后,将显示以下输出。

Publishing the Web Service Example

从输出中,我们可以清楚地看到 DemoApplication 调用了我们的 Web 服务,并且 Web 服务返回的字符串显示在我们的控制台日志中。

摘要

  • WSDL 的全称是 Web Services Description Language
  • WSDL 文档是用于描述 Web 服务的文档。这对于任何客户端应用程序了解 Web 服务的位置至关重要。它还允许客户端应用程序理解 Web 服务中可用的方法。
  • WSDL 文件使得用一种编程语言实现 Web 服务,然后用另一种编程语言调用它变得非常容易。
  • WSDL 文档通常由消息组成。对于每个 Web 方法,都有 2 条消息,一条用于输入,另一条用于输出。它们共同构成一个操作。
  • Web Services Description Language (WSDL) 文件通常在用于相应编程语言的编辑器中创建。
  • 我们已经看到了如何在 Visual Studio 中消耗 Web 服务。这可以通过创建另一个项目(控制台应用程序)来完成。然后通过添加服务引用,我们就可以访问 Web 服务中的 Web 方法了。