サービスのランタイム動作の指定

サービス コントラクトを設計して (Designing Service Contracts)、実装 (Implementing Service Contracts) が終わると、サービス ランタイムの実行動作を構成できます。 ここでは、システム指定のサービスと操作の動作について説明し、新しい動作を作成するための詳細情報の参照先を示します。 一部の動作は属性として適用されますが、多くの動作はアプリケーション構成ファイルまたはプログラムを使用して適用されます。 サービス アプリケーションの構成の詳細については、サービスの構成に関するページを参照してください。

概要

コントラクトは、その種類のサービスの入力、出力、データ型、および機能を定義します。 サービス コントラクトを実装すると、クラスが 1 つ作成されます。このクラスを任意のアドレスのバインディングで構成すると、実装されたコントラクトが満たされます。 コントラクト、バインディング、およびアドレスはすべて、クライアントにとって既知の情報です。これらの情報がないと、クライアントはサービスを利用できません。

ただし、実行の詳細 (スレッド処理の問題点やインスタンスの管理など) は、クライアントには見えません。 サービス コントラクトを実装したら、 動作を使用してさまざまな操作特性を構成できます。 動作とは、ランタイム プロパティを設定するか、カスタマイズの種類をランタイムに挿入する方法で、Windows Communication Foundation (WCF) ランタイムを変更するオブジェクトです。 ユーザー定義の動作を作成してランタイムを変更する方法の詳細については、「ServiceHost とサービス モデル レイヤーの拡張」を参照してください。

System.ServiceModel.ServiceBehaviorAttributeSystem.ServiceModel.OperationBehaviorAttribute 属性は、最も広範に使用できる動作であり、最も一般的に要求される操作機能を公開します。 これらは属性であるため、サービス実装または操作実装に適用します。 その他の動作 ( System.ServiceModel.Description.ServiceMetadataBehaviorSystem.ServiceModel.Description.ServiceDebugBehaviorなど) は、通常、アプリケーション構成ファイルを使用して適用されますが、プログラムにより使用することもできます。

ここでは、ServiceBehaviorAttribute 属性と OperationBehaviorAttribute 属性の概要を示し、動作が影響するさまざまなスコープについて説明します。また、WCF の開発者にとって興味深いと思われる、さまざまなスコープにおける多くのシステム指定の動作についても簡単に説明します。

ServiceBehaviorAttribute と OperationBehaviorAttribute

最も重要な動作は ServiceBehaviorAttribute 属性と OperationBehaviorAttribute 属性です。これらの属性を使用すると、以下を制御できます。

  • インスタンスの有効期間

  • コンカレンシーと同期のサポート

  • 構成の動作

  • トランザクションの動作

  • シリアル化の動作

  • メタデータの変換

  • セッションの有効期間

  • アドレス フィルターとヘッダー処理

  • 権限借用

  • これらの属性を使用するには、サービス実装または操作実装をそのスコープに適切な属性でマークし、プロパティを設定します。 たとえば、次のコード例は、 OperationBehaviorAttribute.Impersonation プロパティを使用した操作実装を示しています。この実装では、この操作の呼び出し元が偽装をサポートするように要求します。

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Name="SampleHello",
    Namespace="http://microsoft.wcf.documentation"
  )]
  public interface IHello
  {
    [OperationContract]
    string Hello(string greeting);
  }

  public class HelloService : IHello
  {

    public HelloService()
    {
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
    }

    ~HelloService()
    {
      Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
    }

    [OperationBehavior(Impersonation=ImpersonationOption.Required)]
    public string Hello(string greeting)
    {
      Console.WriteLine("Called by: " + Thread.CurrentPrincipal.Identity.Name);
      Console.WriteLine("IsAuthenticated: " + Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString());
      Console.WriteLine("AuthenticationType: " + Thread.CurrentPrincipal.Identity.AuthenticationType.ToString());

      Console.WriteLine("Caller sent: " + greeting);
      Console.WriteLine("Sending back: Hi, " + Thread.CurrentPrincipal.Identity.Name);
      return "Hi, " + Thread.CurrentPrincipal.Identity.Name;
    }
  }
}
Imports System.ServiceModel
Imports System.Threading

Namespace Microsoft.WCF.Documentation
    <ServiceContract(Name:="SampleHello", Namespace:="http://microsoft.wcf.documentation")> _
    Public Interface IHello
        <OperationContract> _
        Function Hello(ByVal greeting As String) As String
    End Interface

    Public Class HelloService
        Implements IHello

        Public Sub New()
            Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
        End Sub

        Protected Overrides Sub Finalize()
            Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
        End Sub

        <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
        Public Function Hello(ByVal greeting As String) As String Implements IHello.Hello
            Console.WriteLine("Called by: " & Thread.CurrentPrincipal.Identity.Name)
            Console.WriteLine("IsAuthenticated: " & Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString())
            Console.WriteLine("AuthenticationType: " & Thread.CurrentPrincipal.Identity.AuthenticationType.ToString())

            Console.WriteLine("Caller sent: " & greeting)
            Console.WriteLine("Sending back: Hi, " & Thread.CurrentPrincipal.Identity.Name)
            Return "Hi, " & Thread.CurrentPrincipal.Identity.Name
        End Function
    End Class
End Namespace

これらのプロパティの多くは、バインディングによる追加のサポートを必要とします。 たとえば、クライアントからのトランザクションを要求する操作は、フロー トランザクションをサポートするバインディングを使用するように構成される必要があります。

既知のシングルトン サービス

ServiceBehaviorAttribute 属性と OperationBehaviorAttribute 属性を使用すると、特定の有効期間 ( InstanceContext の有効期間と操作を実装するサービス オブジェクトの有効期間の両方) を制御できます。

たとえば、 ServiceBehaviorAttribute.InstanceContextMode プロパティは InstanceContext の解放頻度を制御し、 OperationBehaviorAttribute.ReleaseInstanceMode プロパティと ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete プロパティはサービス オブジェクトを解放するタイミングを制御します。

ただし、サービス オブジェクトを独自に作成し、そのオブジェクトを使用するサービス ホストを作成することもできます。 そのためには、 ServiceBehaviorAttribute.InstanceContextMode プロパティを Single に設定するか、サービス ホストが開かれたときに例外をスローする必要があります。

このようなサービスを作成するには、 ServiceHost(Object, Uri[]) コンストラクターを使用します。 この方法は、シングルトン サービスが使用する特定のオブジェクト インスタンスを提供する場合に、カスタムの System.ServiceModel.Dispatcher.IInstanceContextInitializer を実装する代わりに使用できます。 サービス実装の型を作成することが困難な場合 (たとえば、パラメーターなしのコンストラクターが作成されない場合) は、このオーバーロードを使用できます。

このコンストラクターにオブジェクトを指定すると、Windows Communication Foundation (WCF) のインスタンス化動作に関するいくつかの機能が異なる動作をすることに注意してください。 たとえば、既知のオブジェクト インスタンスを指定した場合、 InstanceContext.ReleaseServiceInstance を呼び出しても効果はありません。 他のインスタンス解放機構も、同様に無視されます。 ServiceHost クラスは常に、すべての操作について OperationBehaviorAttribute.ReleaseInstanceMode プロパティが ReleaseInstanceMode.None に設定されているかのように動作します。

その他のサービス、エンドポイント、コントラクト、および操作の動作

ServiceBehaviorAttribute 属性などのサービスの動作は、サービス全体に影響します。 たとえば、 ServiceBehaviorAttribute.ConcurrencyMode プロパティを ConcurrencyMode.Multiple に設定すると、そのサービスの各操作で発生するスレッドの同期の問題を自分で処理する必要があります。 エンドポイントの動作はエンドポイント全体に影響し、システム指定のエンドポイントの動作はクライアント機能に対して影響します。 また、コントラクトの動作はコントラクト レベルで影響し、操作の動作は操作の実行を変更します。

これらの動作の多くは属性に実装され、適切なサービス クラスまたは操作実装に適用することによって ServiceBehaviorAttribute 属性および OperationBehaviorAttribute 属性を使用するときにこれらの動作を利用できます。 その他の動作 ( ServiceMetadataBehavior オブジェクトや ServiceDebugBehavior オブジェクトなど) は、通常、アプリケーション構成ファイルを使用して適用されますが、プログラムにより使用することもできます。

たとえば、メタデータの公開は、 ServiceMetadataBehavior オブジェクトを使用して構成されます。 次のアプリケーション構成ファイルは、最も一般的な使用方法を示しています。

<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metadataSupport"
      >
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/SampleService" />
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
        />
        <!-- Adds a WS-MetadataExchange endpoint at -->
        <!-- "http://localhost:8080/SampleService/mex" -->
        <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
      <behavior name="metadataSupport">
        <!-- Enables the IMetadataExchange endpoint in services that -->
        <!-- use "metadataSupport" in their behaviorConfiguration attribute. -->
        <!-- In addition, the httpGetEnabled and httpGetUrl attributes publish -->
        <!-- Service metadata for retrieval by HTTP/GET at the address -->
        <!-- "http://localhost:8080/SampleService?wsdl" -->
        <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  </system.serviceModel>
</configuration>

以下のセクションでは、サービスまたはクライアントのランタイム実行を変更する際に最も役立つ、さまざまなシステム指定の動作について説明します。 リファレンス トピックを参照して、各動作の使用方法を確認してください。

サービスの動作

次の動作は、サービスに影響します。

  • AspNetCompatibilityRequirementsAttribute。 WCF サービスに適用され、そのサービスが ASP.NET 互換モードで実行できるかどうかを示します。

  • ServiceAuthorizationBehavior. サービスがクライアントのクレームを承認する方法を制御します。

  • ServiceCredentials. サービス資格情報を構成します。 このクラスを使用して、X.509 証明書などのサービスの資格情報を指定します。

  • ServiceDebugBehavior. WCF サービスのデバッグ機能とヘルプ情報機能を有効にします。

  • ServiceMetadataBehavior. サービス メタデータと関連情報の公開を制御します。

  • ServiceSecurityAuditBehavior. セキュリティ イベントの監査動作を指定します。

  • ServiceThrottlingBehavior. サービス パフォーマンスを調整できるようにするランタイム スループット設定を構成します。

エンドポイントの動作

以下の動作は、エンドポイントに影響します。 これらの動作の多くは、クライアント アプリケーションで使用されます。

  • CallbackBehaviorAttribute. 双方向クライアント アプリケーションのコールバック サービス実装を構成します。

  • CallbackDebugBehavior. WCF コールバック オブジェクトのサービス デバッグを実行できるようにします。

  • ClientCredentials. クライアントとサービスの資格情報、およびクライアントで使用するサービス資格情報の認証設定をユーザーが構成できるようにします。

  • ClientViaBehavior. トランスポート チャネルを作成する対象の URI (Uniform Resource Identifier) を指定するために、クライアントが使用します。

  • MustUnderstandBehavior. MustUnderstand 処理を無効にするように WCF に指示します。

  • SynchronousReceiveBehavior. チャネルの同期受信プロセスを使用するようにランタイムに指示します。

  • TransactedBatchingBehavior. トランザクションの受信をサポートするトランスポートの受信操作を最適化します。

コントラクトの動作

DeliveryRequirementsAttribute. バインディングがサービスまたはクライアントの実装に対して提供する必要がある機能要件を指定します。

操作の動作

以下の操作の動作は、操作のシリアル化制御およびトランザクション制御を指定します。

関連項目