次の方法で共有


Web サービス エンドポイントを WSDL ファイルに準拠させた後のコード変更

更新 : 2007 年 11 月

実装した Web サービス エンドポイントを Web サービス記述言語 (WSDL: Web Services Description Language) ファイルに準拠させると、エンドポイントに関連付けられている次のコード ファイルが変更される場合があります。

  • Web サービス クラスを実装するファイル。

    このクラスには、操作シグネチャとメソッド本体のコードが含まれています。操作は、WebMethod 属性および関連する他の属性を持つクラス メソッドです。

    Bb385680.alert_note(ja-jp,VS.90).gifメモ :

    実装したエンドポイントを準拠させる場合、メソッド本体のコードは変更されません。ただし、ここで説明されている変更が原因で、メソッド本体のコードがコンパイルされなくなる場合があります。そのため、コードをレビューし、コンパイラ エラーの修正に必要な変更を特定します。

  • カスタム型定義を含む 1 つ以上のクラス ファイル。

変更には、次のものが含まれます。

  • 新しい操作シグネチャの追加

  • 操作シグネチャの更新

  • 操作シグネチャの WebMethod 属性の削除

  • Web サービスと操作の属性の更新

  • カスタム型定義の追加または名前変更

  • 最初に一致する操作のみの準拠

  • 変更に関するコメントのコード ファイルへの追加

[Web サービスの詳細情報] ウィンドウにも、該当する変更が反映されます。次のセクションでは、このような変更の詳細について説明します。

新しい操作シグネチャの追加

WSDL ファイルに新しい操作が記述されると、Visual Studio によって、その操作のシグネチャと属性が Web サービス クラスに追加されます。この新しい操作シグネチャは、WebMethod 属性を探すことで識別できます。

Bb385680.alert_note(ja-jp,VS.90).gifメモ :

WebMethod 属性を持たないクラス メソッドは、操作ではなく、Web メソッド以外のメソッドです。操作を比較する場合、このようなメソッドは含まれません。詳細については、「操作シグネチャの更新」を参照してください。

新しい操作の MessageName パラメータは、WSDL ファイルの操作の名前と一致します。MessageName パラメータは、操作のシグネチャの WebMethod 属性にあります。

Bb385680.alert_note(ja-jp,VS.90).gifメモ :

新しい操作には、既存のクラス メンバ (Web メソッドのみ) と同じ名前が付いている場合があります。この場合、Visual Studio によって、新しい操作のメソッド名に序数が追加され、メソッド名は一意になります。

たとえば、"newCatalog" という名前のメンバが Web サービス クラスに含まれているとします。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()
{...}

操作シグネチャの更新

Web サービス クラス内の操作に一致する操作が WSDL ファイルに記述されると、Visual Studio によって、クラス内の操作シグネチャとその属性が更新されます。Web サービス クラスと WSDL ファイル間で操作を一致させる際に使用される条件を次に示します。このような条件を示す例では、クラス コードを (同じメッセージ名の付いた) "getCatalog" という名前の WSDL 操作と比較します。

  • クラス操作は、WSDL 操作と同じメッセージ名が付いていても、同じメソッド名が付いていない場合に "一致します"。

    Bb385680.alert_note(ja-jp,VS.90).gifメモ :

    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 属性の削除

WSDL ファイルに記述されていない操作を Web サービス クラスで実装すると、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 ファイルから追加された操作シグネチャはカスタム型を参照する場合があります。関連付けられたアプリケーションが実装されると、1 つ以上のクラス ファイルがソリューションで表示される場合があります。これらのファイルには、対応する型定義が含まれています。ファイル名には次の形式を使用します。

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

Bb385680.alert_note(ja-jp,VS.90).gifメモ :

ファイル名の拡張子は、実装する言語によって異なります。

このようなファイルでは、これらの型定義を含む名前空間に次の形式を使用します。

Namespace <DefaultNamespace>.<ServiceName>CustomTypes 

たとえば、"MyService" という名前のサービスが WSDL ファイルに記述されているとします。このサービスは、"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 ファイルに記述されている新しい型の定義が含まれます。このような定義は、サービス名を含む名前空間内に表示されます。

  • サービス名は同じでも、1 つ以上の既存の型定義に WSDL ファイルに記述されている型と同じ名前が付いている場合。

    このシナリオでは、Visual Studio によって、型名に "_Obsolete" というテキストが追加され、既存の型定義の名前が変更されます。Visual Studio は、以前競合していた型と同じ型ファイルと名前空間に新しい型定義を追加します。その後、この Web サービスに対する操作は、以前競合していた型ではなく、新しい型を参照します。

    Bb385680.alert_note(ja-jp,VS.90).gifメモ :

    "_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 ファイルに記述されている型の定義が含まれます。このような定義は、新しいサービス名を使用する名前空間内に表示されます。

    Bb385680.alert_note(ja-jp,VS.90).gifメモ :

    Web サービス クラスは、新しいサービス名でも更新されます。

カスタム型の詳細については、「WSDL ファイルに基づいた Web サービス エンドポイント」を参照してください。

最初に一致する操作のみの準拠

Web サービス クラスは、WSDL ファイルに記述されている操作と一致する複数の操作を実装する場合があります。このシナリオでは、最初に一致する操作シグネチャだけが WSDL ファイルに準拠します。それ以外の一致する操作シグネチャは変更されません。

この状況を解決するには、適切な操作シグネチャが準拠していることを確認します。必要に応じて、他の操作を変更し、今後重複しないようにします。

変更に関するコメントのコード ファイルへの追加

Visual Studio では、こうした変更に関する一般的なコメントもコード ファイルに追加されます。これらのコメントには、日付と、変更を行ったユーザーの名前が含まれます。

参照

処理手順

方法 : Web サービス エンドポイントを WSDL ファイルに準拠させる