WSDL 教程:Web 服务 Descript离子语言示例

什么是 WSDL?

Web服务 Descript离子语言 (WSDL) 是一个基于 XML 的文件,它基本上告诉客户端应用程序 Web 服务的作用。WSDL 文件用于简要描述 Web 服务的作用,并为客户端提供连接到 Web 服务和使用 Web 服务提供的所有功能所需的所有信息。

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

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

WSDL 文档的结构

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

  • WSDL 文件包含 Web 服务的位置和
  • Web 服务公开的方法。

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

以下是 WSDL 文件的一般结构

  • 定义
  • Target命名空间
  • 数据类型
  • 收件箱
  • 端口类型
  • 绑定
  • 服务

这里要注意的一个关键点是消息的定义,也就是 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 文件的结构图

WSDL 文档的结构
WSDL 的结构

WSDL 元素

WSDL 文件包含以下主要部分

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

为什么使用 WSDL

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

Web 服务具有以下主要功能

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

WSDL 文件以纯 XML 格式编写。之所以采用 XML 格式,是为了使任何编程语言都可以读取该文件。

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

需要 WSDL

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

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

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

WSDL 消息部分

WSDL 包含一个名为“消息”的部分,该部分由 元件。

该元素主要用于描述在 Web 服务和客户端应用程序之间交换的数据。

每个 Web 服务始终会有两种类型的消息,

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

每条消息都会有一个 用于描述输入和输出消息所使用的参数的元素。

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

WSDL 消息部分

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

端口类型绑定

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

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

WSDL 提供了一个名为 用于定义Web服务提供的操作。

端口类型绑定

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

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

除了 元素,还有 用于定义如何传输消息的元素。

端口类型绑定

  1. 上述示例显示绑定由一个绑定名称组成,在我们的示例中为“TutorialSoapBinding”。简单来说,绑定是客户端应用程序用来将自身实际绑定到 Web 服务的信息。一旦它实际绑定到 Web 服务,它便能够调用 Web 服务公开的各种操作。
  2. 传输层为 http://,这意味着消息将通过 HTTP 协议传输。

创建 WSDL 文件

无论何时使用任何编程语言构建 Web 服务,都会创建 WSDL 文件。

由于 WSDL 文件从头开始生成相当复杂,因此所有编辑器(如 Visual Studio for .Net 和 Eclipse HPMC胶囊 Java 自动创建 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 服务。创建 Web 服务的详细步骤如下: 网络 web 项目和 web 服务的创建已经解释 这里; 请按照相同的步骤创建项目和 Web 服务。关键部分是在 Web 服务文件中输入以下代码。

发布 Web 服务示例

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。在这个 Web 方法中,我们包含了一个整数参数,每次调用这个 Web 方法时都需要传递该参数。
  2. 接下来我们定义一个名为“TutorialName”的变量,它将保存“Web Services”的字符串值。这是调用 Web 服务时返回的值。

步骤2) 一旦我们定义了 Web 服务文件,下一步就是创建一个将使用该 Web 服务的客户端项目。

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

右键单击 Visual Studio 解决方案文件并选择选项“添加”->“新项目”

发布 Web 服务示例

步骤 3) 在此步骤中,

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

发布 Web 服务示例

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

发布 Web 服务示例

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

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

发布 Web 服务示例

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

为此,右键单击 DemoApplication 项目文件并选择菜单选项 Add->Service Reference。

发布 Web 服务示例

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

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

发布 Web 服务示例

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

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

发布 Web 服务示例

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

发布 Web 服务示例

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 创建的主文件。执行控制台应用程序(在我们的示例中为演示应用程序)时将执行此文件。
  2. 然后,我们创建一个名为“client”的变量,该变量将设置为我们在前面步骤中创建的服务引用的实例。在我们的例子中,服务引用是“Guru99Webservice.Guru99WebserviveSoapClient()”
  3. 然后我们在 TutorialService Web 服务中调用我们的 Web 方法“GetTutorialService”。请记住,我们的 GetTutorialService 方法接受一个整数参数,因此我们只是将一个整数参数传递给 Web 方法。
  4. 最后一行只是为了确保控制台日志屏幕保持活动状态,以便我们可以查看输出。此命令将等待用户的一些输入。

输出

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

发布 Web 服务示例

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

结语

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