サービス コントラクト (サービス コントラクトの設計) を設計し、サービス コントラクトを実装 (サービス コントラクトの実装) したら、サービス ランタイムの操作動作を構成できます。 このトピックでは、システム提供のサービスと操作の動作について説明し、新しい動作を作成するための詳細情報を見つける場所について説明します。 一部の動作は属性として適用されますが、多くはアプリケーション構成ファイルまたはプログラムを使用して適用されます。 サービス アプリケーションの構成の詳細については、「サービスの 構成」を参照してください。
概要
コントラクトは、その型のサービスの入力、出力、データ型、および機能を定義します。 サービス コントラクトを実装すると、アドレスでバインディングを設定されることで、そのコントラクトを満たすクラスが作成されます。 クライアントは契約に関する情報、拘束条件、住所に関する情報をすべて知っています。それらがなければ、クライアントはサービスを利用できません。
ただし、スレッドの問題やインスタンス管理などの操作の詳細は、クライアントに対して不透明です。 サービス コントラクトを実装したら、 動作を使用して多数の操作特性を構成できます。 動作は、ランタイム プロパティを設定するか、カスタマイズ型をランタイムに挿入することによって、Windows Communication Foundation (WCF) ランタイムを変更するオブジェクトです。 ユーザー定義の動作を作成してランタイムを変更する方法の詳細については、「 ServiceHost とサービス モデル レイヤーの拡張」を参照してください。
System.ServiceModel.ServiceBehaviorAttribute属性とSystem.ServiceModel.OperationBehaviorAttribute属性は、最も広く役立つ動作であり、最も一般的に要求される操作機能を公開します。 これらは属性であるため、サービスまたは操作の実装に適用します。 System.ServiceModel.Description.ServiceMetadataBehaviorやSystem.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
プロパティの多くは、バインディングからの追加のサポートを必要とします。 たとえば、クライアントからのトランザクションを必要とする操作は、フローされたトランザクションをサポートするバインディングを使用するように構成する必要があります。
Well-Known シングルトンサービス
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。 バインディングがサービスまたはクライアントの実装に提供する必要がある機能要件を指定します。
操作動作
次の操作の動作では、操作のシリアル化とトランザクション制御を指定します。
DataContractSerializerOperationBehavior。 System.Runtime.Serialization.DataContractSerializerの実行時の動作を表します。
XmlSerializerOperationBehavior。
XmlSerializer
の実行時の動作を制御し、操作に関連付けます。TransactionFlowAttribute。 サービス操作がトランザクション ヘッダーを受け入れるレベルを指定します。