生成されたクライアント コードの理解Understanding Generated Client Code

ServiceModel Metadata Utility Tool (Svcutil.exe) は、クライアント アプリケーションの構築時に使用するクライアント コードとクライアント アプリケーション構成ファイルを生成します。The ServiceModel Metadata Utility Tool (Svcutil.exe) generates client code and a client application configuration file for use in building client applications. このトピックでは、標準サービス コントラクトのシナリオ向けに生成されたコード例について説明します。This topic provides a tour of generated code examples for standard service contract scenarios. 生成されたコードを使用してクライアント アプリケーションの作成の詳細については、次を参照してください。 WCF クライアントの概要です。For more information about building a client application using the generated code, see WCF Client Overview.

概要Overview

Visual Studio を使用して、プロジェクトの種類の Windows Communication Foundation (WCF) クライアントを生成する場合、通常必要はありません、生成されたクライアント コードを調べる。If you use Visual Studio to generate Windows Communication Foundation (WCF) client types for your project, you typically do not need to examine the generated client code. 同じサービスを実行する開発環境を使用していない場合は、Svcutil.exe のようなツールを使用してクライアント コードを生成し、そのコードでクライアント アプリケーションを開発します。If you are not using a development environment that performs the same services for you, you can use a tool such as Svcutil.exe to generate client code and then use that code to develop your client application.

Svcutil.exe には、生成された型情報を変更する多くのオプションがあるため、ここですべてのシナリオを説明することはできません。Because Svcutil.exe has a number of options that modify the generated type information, this topic does not discuss all scenarios. ここでは、生成されたコードの検索に関する標準的な作業の例を紹介します。However, the following standard tasks involve locating generated code:

  • サービス コントラクト インターフェイスの識別Identifying service contract interfaces.

  • WCF クライアント クラスを識別します。Identifying the WCF client class.

  • データ型の識別Identifying data types.

  • 双方向サービスのコールバック コントラクトの識別Identifying callback contracts for duplex services.

  • ヘルパーのサービス コントラクトのチャネル インターフェイスの識別Identifying the helper service contract channel interface.

サービス コントラクト インターフェイスの検索Finding Service Contract Interfaces

サービス コントラクトをモデル化するインターフェイスを検索するには、System.ServiceModel.ServiceContractAttribute 属性でマークされたインターフェイスを検索します。To locate the interfaces that model service contracts, search for interfaces that are marked with the System.ServiceModel.ServiceContractAttribute attribute. 多くの場合、属性自体に設定された他の属性や明示的なプロパティが存在するため、この属性をすばやく読み取って見つけることは簡単ではありません。Often this attribute can be difficult to locate with a quick read due to the presence of other attributes and the explicit properties set on the attribute itself. サービス コントラクト インターフェイスとクライアント コントラクト インターフェイスは 2 つの別の種類だという点に注意してください。Remember that the service contract interface and the client contract interface are two different types. 次のコード例は、元のサービス コントラクトを示しています。The following code example shows the original service contract.

[ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
  [OperationContractAttribute]
  [FaultContractAttribute(typeof(microsoft.wcf.documentation.SampleFault))]
  string SampleMethod(string msg);
}

次のコード例は、Svcutil.exe で生成された同じサービス コントラクトを示しています。The following code example shows the same service contract as generated by Svcutil.exe.

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

と共に生成されるサービス コントラクト インターフェイスを使用して、System.ServiceModel.ChannelFactoryサービス操作の呼び出しに使用する WCF チャネル オブジェクトを作成するクラス。You can use the generated service contract interface along with the System.ServiceModel.ChannelFactory class to create a WCF channel object with which to invoke service operations. 詳細については、次を参照してください。する方法: ChannelFactory を使用してです。For more information, see How to: Use the ChannelFactory.

WCF クライアント クラスの検索Finding WCF Client Classes

拡張機能の検索に使用するサービス コントラクトを実装する WCF クライアント クラスを見つけるには、 System.ServiceModel.ClientBase<TChannel>、ここで、型パラメーターは、サービス コントラクトを以前にあるし、そのインターフェイスを拡張します。To locate the WCF client class that implements the service contract you want to use, search for an extension of System.ServiceModel.ClientBase<TChannel>, where the type parameter is the service contract interface that you previously located and that extends that interface. 次のコード例は、 ClientBase<TChannel> 型の ISampleServiceクラスを示しています。The following code example shows the ClientBase<TChannel> class of type ISampleService.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class SampleServiceClient : System.ServiceModel.ClientBase<ISampleService>, ISampleService
{

    public SampleServiceClient()
    {
    }

    public SampleServiceClient(string endpointConfigurationName)
        :
            base(endpointConfigurationName)
    {
    }

    public SampleServiceClient(string endpointConfigurationName, string remoteAddress)
        :
            base(endpointConfigurationName, remoteAddress)
    {
    }

    public SampleServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress)
        :
            base(endpointConfigurationName, remoteAddress)
    {
    }

    public SampleServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress)
        :
            base(binding, remoteAddress)
    {
    }
    public string SampleMethod(string msg)
    {
        return base.Channel.SampleMethod(msg);
    }
}

この WCF クライアント クラスを使用するには、新しいインスタンスを作成して実装されているメソッドを呼び出すことです。You can use this WCF client class by creating a new instance of it and calling the methods it implements. これらのメソッドは、対応しているサービス操作を呼び出し、やり取りを行うように構成されています。Those methods invoke the service operation with which it is designed and configured to interact. 詳細については、次を参照してください。 WCF クライアントの概要です。For more information, see WCF Client Overview.

注意

SvcUtil.exe で WCF クライアント クラスが生成されるとき、 DebuggerStepThroughAttribute がクライアント クラスに追加されるため、デバッガーで WCF クライアント クラスをステップ実行できなくなります。When SvcUtil.exe generates a WCF client class, it adds a DebuggerStepThroughAttribute to the client class that prevents debuggers from stepping through the WCF client class.

データ型の検索Finding Data Types

生成されたコード内でデータ型を検索する最も基本的な方法は、コントラクトに指定された型名を識別し、その型宣言のコードを検索することです。To locate data types in the generated code, the most basic mechanism is to identify the type name specified in a contract and search the code for that type declaration. たとえば、次のコントラクトには、 SampleMethod が型 microsoft.wcf.documentation.SampleFaultの SOAP エラーを返せることが指定されています。For example, the following contract specifies that the SampleMethod can return a SOAP fault of type microsoft.wcf.documentation.SampleFault.

[System.ServiceModel.OperationContractAttribute(
  Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
  ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
  typeof(microsoft.wcf.documentation.SampleFault),
  Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);

SampleFault を検索すると、次の型宣言が見つかります。Searching for SampleFault locates the following type declaration.

[assembly: System.Runtime.Serialization.ContractNamespaceAttribute(
  "http://microsoft.wcf.documentation",
  ClrNamespace = "microsoft.wcf.documentation"
)]
namespace microsoft.wcf.documentation
{
    using System.Runtime.Serialization;

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute()]
    public partial class SampleFault : object, System.Runtime.Serialization.IExtensibleDataObject
    {
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        private string FaultMessageField;

        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
        {
            get
            {
                return this.extensionDataField;
            }
            set
            {
                this.extensionDataField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute()]
        public string FaultMessage
        {
            get
            {
                return this.FaultMessageField;
            }
            set
            {
                this.FaultMessageField = value;
            }
        }
    }
}

この場合、このデータ型は、クライアントの特定の例外 ( FaultException<TDetail> ) によりスローされる詳細な型です。詳細な型のパラメーターは、 microsoft.wcf.documentation.SampleFaultです。In this case the data type is the detail type thrown by a specific exception on the client, a FaultException<TDetail> where the detail type parameter is microsoft.wcf.documentation.SampleFault. データ型の詳細については、次を参照してください。サービス コントラクトのデータ転送を指定するです。For more information about data types, see Specifying Data Transfer in Service Contracts. クライアントでの例外処理の詳細については、次を参照してください。送信と受信エラーです。For more information about handling exceptions in clients, see Sending and Receiving Faults.

双方向サービスのコールバック コントラクトの検索Finding Callback Contracts for Duplex Services

コントラクト インターフェイスにより ServiceContractAttribute.CallbackContract プロパティの値が指定されているサービス コントラクトを検索すると、そのコントラクトには双方向コントラクトが指定されていることがわかります。If you locate a service contract for which the contract interface specifies a value for the ServiceContractAttribute.CallbackContract property, then that contract specifies a duplex contract. 二重のコントラクトを使用した場合、クライアント アプリケーションは、コールバック コントラクトを実装するコールバック クラスを作成し、そのクラスのインスタンスを、サービスとの通信に使用する System.ServiceModel.DuplexClientBase<TChannel> または System.ServiceModel.DuplexChannelFactory<TChannel> に渡す必要があります。Duplex contracts require the client application to create a callback class that implements the callback contract and pass an instance of that class to the System.ServiceModel.DuplexClientBase<TChannel> or System.ServiceModel.DuplexChannelFactory<TChannel> used to communicate with the service. 双方向クライアントの詳細については、次を参照してください。する方法: 双方向コントラクトでサービスをアクセスです。For more information about duplex clients, see How to: Access Services with a Duplex Contract.

次のコントラクトは、型 SampleDuplexHelloCallbackのコールバック コントラクトを指定しています。The following contract specifies a callback contract of type SampleDuplexHelloCallback.

[System.ServiceModel.ServiceContractAttribute(
  Namespace="http://microsoft.wcf.documentation", 
  ConfigurationName="SampleDuplexHello", 
  CallbackContract=typeof(SampleDuplexHelloCallback), 
  SessionMode=System.ServiceModel.SessionMode.Required
)]
public interface SampleDuplexHello
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true, 
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Hello"
    )]
    void Hello(string greeting);
  }
    <System.ServiceModel.OperationContractAttribute(IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Hello")> _
    Sub Hello(ByVal greeting As String)
End Interface 'SampleDuplexHello

このコールバック コントラクトを検索すると、クライアント アプリケーションが実装する必要のある次のインターフェイスが見つかります。Searching for that callback contract locates the following interface that the client application must implement.

  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface SampleDuplexHelloCallback
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true, 
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Reply"
    )]
    void Reply(string responseToGreeting);
  }
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Public Interface SampleDuplexHelloCallback
    <System.ServiceModel.OperationContractAttribute( _
        IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Reply")> _
    Sub Reply(ByVal responseToGreeting As String)
End Interface 'SampleDuplexHelloCallback

サービス コントラクト チャネル インターフェイスの検索Finding Service Contract Channel Interfaces

サービス コントラクト インターフェイスで ChannelFactory クラスを使用する場合、明示的にチャネルを開いたり、閉じたり、中止したりするには、System.ServiceModel.IClientChannel インターフェイスにキャストする必要があります。When using the ChannelFactory class with a service contract interface, you must cast to the System.ServiceModel.IClientChannel interface to explicitly open, close, or abort the channel. 処理を容易にするために、Svcutil.exe ツールでは、サービス コントラクト インターフェイスと IClientChannel の両方を実装するヘルパー インターフェイスも生成されます。これにより、キャストを行わずにクライアント チャネル インフラストラクチャとのやりとりを実現できます。To make it easier to work with, the Svcutil.exe tool also generates a helper interface that implements both the service contract interface and IClientChannel to enable you to interact with the client channel infrastructure without having to cast. 上記のサービス コントラクトを実装するヘルパー クライアント チャネルの定義を、次のコード例に示します。The following code shows the definition of a helper client channel that implements the preceding service contract.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

関連項目See Also

WCF クライアントの概要WCF Client Overview