共用方式為


在 Web 服務端點符合 WSDL 檔案後的程式碼變更

更新:2007 年 11 月

當您確定實作的 Web 服務端點符合 Web 服務描述語言工具 (WSDL) 檔案之後,下列與端點相關聯的程式碼檔案可能會有所變更:

  • 實作 Web 服務類別的檔案。

    這個類別包含作業簽章和任何方法的程式碼主體。作業是具有 WebMethod 屬性和其他相關屬性的類別方法。

    注意事項:

    當實作的端點符合時,沒有任何方法主體程式碼會變更。但是,本主題所描述的變更可能會導致方法主體程式碼無法編譯。因此,請檢閱您的程式碼並識別出修正任何編譯器錯誤所需要的變更。

  • 一個或多個包含自訂型別定義的類別檔案。

變更可能包含下列項目:

  • 加入新的作業簽章

  • 更新作業簽章

  • 從作業簽章移除 WebMethod 屬性

  • 更新 Web 服務和作業屬性

  • 加入或重新命名自訂型別定義

  • 只符合第一個相符的作業

  • 將有關變更的註解加入至程式碼檔案

[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 檔案加入的作業簽章可能會參考自訂型別。實作關聯的應用程式之後,一或多個類別檔案可能會出現在您的方案中。這些檔案包含對應的型別定義。他們的檔案名稱會使用下列格式:

"<ServiceName><CustomTypeName>.<FileExtension>"

注意事項:

副檔名會視實作語言而定。

在這些檔案中,包含這些型別定義的命名空間會使用下列格式:

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 服務端點

只符合第一個相符的作業

Web 服務類別可能會實作與 WSDL 檔案所描述之作業相符的多個作業。在這個案例中,只有第一個相符的作業簽章會符合 WSDL 檔案。其餘相符的作業簽章將不會變更。

若要修正這個條件,請確認是否符合正確的作業簽章。視需要,修改其他相符的作業,以避免未來會出現重複的項目。

將有關變更的註解加入至程式碼檔案

Visual Studio 也會將說明這些變更的一般註解加入至程式碼檔案。這些註解包含變更日期和進行變更的使用者名稱。

請參閱

工作

HOW TO:使 Web 服務端點符合 WSDL 檔案