在使 Web 服务终结点符合 WSDL 文件之后进行的代码更改

更新:2007 年 11 月

在使已实现的 Web 服务终结点符合 Web 服务描述语言 (WSDL) 文件后,下列与该终结点关联的代码文件可能会发生更改:

  • 实现 Web 服务类的文件。

    此类包含操作签名和任何方法体代码。操作是一个带有 WebMethod 属性及其他相关属性的类方法。

    说明:

    在使已实现的终结点符合 WSDL 文件时,不会更改任何方法体代码。但是,本主题中介绍的更改可能会导致方法体代码不再能编译。因此,请查看您的代码,并确定修复任何编译器错误时可能需要的更改。

  • 一个或多个包含自定义类型定义的类文件。

更改可能包括以下几方面:

  • 添加新的操作签名

  • 更新操作签名

  • 从操作签名中移除 WebMethod 属性

  • 更新 Web 服务和操作属性

  • 添加或重命名自定义类型定义

  • 仅使第一个匹配的操作符合 WSDL 文件

  • 添加关于代码文件更改的注释

“Web 服务详细信息”窗口也将反映相应的更改。有关这些更改的更多信息,请参见以下各节。

添加新的操作签名

如果 WSDL 文件描述了一个新操作,Visual Studio 会将该操作的签名和属性添加到 Web 服务类中。通过查找 WebMethod 属性,可以识别这一新的操作签名。

说明:

不带 WebMethod 属性的类方法为非 Web 方法,不属于操作。在比较操作时,将不包括这类方法。有关更多信息,请参见更新操作签名。

新操作的 MessageName 参数将与该操作在 WSDL 文件中的名称匹配。您可以在操作签名的 WebMethod 属性中找到 MessageName 参数。

说明:

新操作可能与某个现有的类成员(非 Web 方法除外)同名。在此情况下,Visual Studio 会在新操作的方法名称中添加一个序号,以使其变为唯一的名称。

例如,假设 Web 服务类包含一个名为“newCatalog”的成员。如果 WSDL 文件描述了一个名为“newCatalog”的操作,则该操作的方法名称在该类中将显示为“newCatalog2”。下面的代码行演示了符合此 WSDL 文件后的结果:

[Visual Basic]
Public newCatalog As String

'''<remarks> [UserName::Date] This Web method was added after conforming this service to the WSDL file. </remarks>
<System.Web.Services.WebMethod(MessageName="newCatalog")> _
<System.Web.Services.Protocols.SoapDocumentMethod(Binding:="MyWebService")> _
Public Sub getCatalog2()
...
End Sub

[Visual C#]
public string newCatalog;

/// <remarks> [UserName::Date] This Web method was added after conforming this service to the WSDL file. </remarks>
[System.Web.Services.WebMethod(MessageName="newCatalog"), System.Web.Services.Protocols.SoapDocumentMethod(Binding = "MyWebService")]
public string newCatalog2()
{...}

更新操作签名

如果 WSDL 文件描述的操作与 Web 服务类中的操作匹配,Visual Studio 将更新该操作签名及其在类中的属性。下面的列表描述了用于在 Web 服务类和 WSDL 文件之间匹配操作的条件。演示这些条件的示例将类代码与名为“getCatalog”的 WSDL 操作(具有相同的消息名称)进行比较:

  • 如果一个类操作与 WSDL 操作具有相同的消息名称,但具有不同的方法名称,则认为该类操作“匹配”。

    说明:

    MessageName 属性用于标识操作的消息名称。

    例如,下面的类操作与“getCatalog”WSDL 操作匹配:

    [System.Web.Services.WebMethod(MessageName = "getCatalog")]
    public void getNewCatalog()
    
  • 如果一个类操作没有消息名称,但与 WSDL 操作具有相同的方法名称,则认为该类操作“匹配”。

    例如,下面的类操作与“getCatalog”WSDL 操作匹配:

    [System.Web.Services.WebMethod()]
    public void getCatalog()
    
  • 如果一个类操作与 WSDL 操作具有相同的方法名称,但没有相同的消息名称,则认为该类操作“不匹配”。

    例如,下面的类操作与“getCatalog”WSDL 操作不匹配:

    [System.Web.Services.WebMethod(MessageName = "getGolfCatalog")]
    public void getCatalog()
    
  • 如果一个类方法具有相同的方法名称,但没有 WebMethod 属性,则认为该类方法不是操作。此方法将保留不变,并改为向类中添加新的操作签名和相应的属性。

    例如,下面的类方法与“getCatalog”WSDL 操作不匹配,原因是它缺少 WebMethod 属性,因而保留不变:

    public void getCatalog()
    

从操作签名中移除 WebMethod 属性

如果 Web 服务类实现了未在 WSDL 文件中描述的操作,Visual Studio 将在类中移除该操作的 WebMethod 属性及其他相应的属性。该操作将更改为非 Web 方法。

例如,下面的代码行演示了在符合 WSDL 文件前具有 WebMethod 属性及其他相应属性的操作:

[Visual Basic]
<System.Web.Services.WebMethod()> _
<System.Web.Services.Protocols.SoapDocumentMethod(Binding:="myWebService")> _
Public Sub getCatalog()
...
End Sub

[Visual C#]
[System.Web.Services.WebMethod(), System.Web.Services.Protocols.SoapDocumentMethod(Binding = "myWebService")]
public void getCatalog()
{...}

下面的代码行演示了该操作在符合不再描述它的 WSDL 文件后是如何失去 WebMethod 属性及其他属性的。该操作将变成一个非 Web 方法:

[Visual Basic]
''' <remarks>[UserName::Date] The WebMethod attribute was removed after conforming this service to the WSDL file. This operation does not exist under the corresponding port type in the WSDL file. </remarks>
Public Sub getCatalog()
...
End Sub

[Visual C#]
/// <remarks>[UserName::Date] The WebMethod attribute was removed after conforming this service to the WSDL file. This operation does not exist under the corresponding port type in the WSDL file. </remarks>
public void getCatalog() 
{...}

更新 Web 服务和操作属性

如果 Web 服务类或操作的属性与 WSDL 文件不匹配,Visual Studio 将在类中更新它们。例如:

  • Web 服务名称和命名空间可能会被更新。

    如果类中的服务名称和命名空间不同于 WSDL 文件中的服务名称和命名空间,Visual Studio 将更新它们。Visual Studio 会将类中的这些值更新为 WebServiceBinding 属性的一部分。

  • 每个操作绑定名称都会被更新。

    如果类中每个操作的绑定名称均不同于 WSDL 文件中的名称,Visual Studio 将更新这些绑定名称。它会在类中将此值更新为每个操作的 SoapDocumentMethod 属性的一部分。

下面的列表包含可能被更新的其他属性:

  • WebMethod

  • WebService

  • SoapDocumentService

  • SoapRpcMethod

  • SoapRpcService

用户添加的任何属性都将保留不变。

添加或重命名自定义类型定义

从 WSDL 文件中添加的操作签名可能会引用自定义类型。在实现关联的应用程序后,解决方案中可能会出现一个或多个类文件。这些文件包含相应的类型定义。它们的文件名采用以下格式:

“<服务名称><自定义类型名称>.<文件扩展名>”

说明:

文件扩展名由实现语言决定。

在这些文件中,包含这些类型定义的命名空间采用以下格式:

Namespace <DefaultNamespace>.<ServiceName>CustomTypes 

例如,假设 WSDL 文件描述了一项名为“MyService”的服务。该服务提供的操作引用名为“MyCustomType”的自定义类型。

在使 Web 服务终结点符合此 WSDL 文件时,新添加的操作签名也会引用此自定义类型。该类型文件的名称为“MyServiceMyCustomType.vb”或“MyServiceMyCustomType.cs”,具体取决于关联的应用程序是用 Visual Basic 实现的,还是用 Visual C# 实现的。在此类型文件中,命名空间和类型定义会显示为以下形式:

[Visual Basic]
Namespace ApplicationName.MyServiceCustomTypes
   Public Class MyCustomType
   ...
   End Class
End Namespace

[Visual C#]
namespace ApplicationName.MyServiceCustomTypes 
{
   public class MyCustomType
   {...}
}

根据下列条件,在使 Web 服务终结点符合 WSDL 文件时,这些文件中会发生不同的更改:

  • 服务名称相同;但是,现有的类型定义均不与 WSDL 文件中描述的类型同名。

    在此情况下,将向解决方案中添加新的类型文件。这些文件包含 WSDL 文件中所描述的新类型的定义。这些定义显示在具有该服务名称的命名空间中。

  • 服务名称相同;但是,一个或多个现有的类型定义与 WSDL 文件中描述的类型同名。

    在此情况下,Visual Studio 会通过在类型名称后追加“_Obsolete”文字来重命名现有的类型定义。接下来,Visual Studio 会将新的类型定义添加到以前冲突的类型所在的类型文件和命名空间中。此 Web 服务的操作随后会引用新的类型,而不再引用以前的冲突类型。

    说明:

    如果命名空间中已包含带“_Obsolete”字符串的重命名类型,Visual Studio 会在此字符串后追加一个序号,从而生成唯一的名称。

    例如,假设类型文件包含名为“myCustomType”的类型。如果 WSDL 文件还另外描述了一个与之同名的类型,Visual Studio 会将此类型重命名为“myCustomType_Obsolete”。接下来,Visual Studio 会将该类型定义添加到类型文件中。

    如果类型文件包含“myCustomType_Obsolete”和“myCustomType”,则 Visual Studio 会将“myCustomType”重命名为“myCustomType_Obsolete2”。随后,Visual Studio 再将类型定义添加到类型文件中。

  • 服务名称不同。

    在此情况下,Visual Studio 不会修改任何现有的类型文件。此时,Visual Studio 将改为向解决方案中添加具有新服务名称的新类型文件。这些文件包含 WSDL 文件中所描述的类型的定义。这些定义显示在使用新服务名称的命名空间中。

    说明:

    该 Web 服务类也将更新为使用新的服务名称。

有关自定义类型的更多信息,请参见基于 WSDL 文件的 Web 服务终结点

仅使第一个匹配的操作符合 WSDL 文件

一个 Web 服务类可能会实现多个与 WSDL 文件中所描述的操作匹配的操作。在此情况下,只有第一个匹配的操作签名符合 WSDL 文件。其他匹配的操作签名将不会更改。

若要纠正此问题,请确认符合 WDSL 文件的操作签名是否适当。如果适当,请修改其他匹配的操作,以避免将来出现重复。

添加关于代码文件更改的注释

Visual Studio 还将添加描述这些代码文件更改的一般注释。这些注释包括更改日期以及做出这些更改的用户的名称。

请参见

任务

如何:使 Web 服务终结点符合 WSDL 文件