ServiceValidation サンプルでは、カスタム動作を使用してコンピューター上のサービスを検証し、特定の条件を満たしていることを確認する方法を示します。 このサンプルでは、サービスの各エンドポイントをスキャンし、セキュリティで保護されたバインド要素が含まれているかどうかを確認することで、カスタム動作によってサービスが検証されます。 このサンプルは、入門に基づいています。
注
このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。
エンドポイント検証のカスタム動作
Validate
インターフェイスに含まれるIServiceBehavior メソッドにユーザー コードを追加することで、ユーザー定義アクションを実行するためのカスタム動作をサービスまたはエンドポイントに与えることができます。 次のコードは、サービスに含まれる各エンドポイントをループ処理するために使用されます。このコードでは、バインド コレクションを検索してセキュリティで保護されたバインディングを検索します。
public void Validate(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
// Loop through each endpoint individually, gathering their
// binding elements.
foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints)
{
secureElementFound = false;
// Retrieve the endpoint's binding element collection.
BindingElementCollection bindingElements =
endpoint.Binding.CreateBindingElements();
// Look to see if the binding elements collection contains any
// secure binding elements. Transport, Asymmetric, and Symmetric
// binding elements are all derived from SecurityBindingElement.
if ((bindingElements.Find<SecurityBindingElement>() != null) || (bindingElements.Find<HttpsTransportBindingElement>() != null) || (bindingElements.Find<WindowsStreamSecurityBindingElement>() != null) || (bindingElements.Find<SslStreamSecurityBindingElement>() != null))
{
secureElementFound = true;
}
// Send a message to the system event viewer when an endpoint is deemed insecure.
if (!secureElementFound)
throw new Exception(System.DateTime.Now.ToString() + ": The endpoint \"" + endpoint.Name + "\" has no secure bindings.");
}
}
Web.config ファイルに次のコードを追加すると、サービスが認識する serviceValidate
動作拡張機能が追加されます。
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="endpointValidate" type="Microsoft.ServiceModel.Samples.EndpointValidateElement, endpointValidate, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
...
</system.serviceModel>
動作拡張機能がサービスに追加されると、Web.config ファイル内の動作の一覧に endpointValidate
の動作をサービスに追加できるようになりました。
<behaviors>
<serviceBehaviors>
<behavior name="CalcServiceSEB1">
<serviceMetadata httpGetEnabled="true" />
<endpointValidate />
</behavior>
</serviceBehaviors>
</behaviors>
Web.config ファイルに追加される動作とその拡張機能は個々のサービスに適用されますが、Machine.config ファイルに追加すると、コンピューター上でアクティブなすべてのサービスに動作が適用されます。
注
すべてのサービスに動作を追加する場合は、変更を加える前に Machine.config ファイルをバックアップすることをお勧めします。
次に、このサンプルの client\bin ディレクトリに用意されているクライアントを実行します。 例外がスローされ、"要求されたサービス http://localhost/servicemodelsamples/service.svc
をアクティブ化できませんでした" というメッセージが表示されます。これは、エンドポイントを検証する動作によって、そのエンドポイントが安全でないと見なされるため、サービスが開始されないようになっているためです。 この動作では、セキュリティで保護されていないエンドポイントを記述する内部例外もスローされ、"System.ServiceModel 4.0.0.0" ソースと "WebHost" カテゴリの下のシステム イベント ビューアーにメッセージが書き込まれます。 このサンプルでは、サービスのトレースを有効にすることもできます。 これにより、ユーザーは、エンドポイントの動作検証によってスローされた例外を、Service Trace Viewer ツールを使用して生成されたサービス トレースを開くことで表示できます。
失敗したエンドポイント検証例外メッセージをイベント ビューアーで表示する
[ スタート ] メニューをクリックし、[実行] を選択 します。
「
eventvwr
」と入力し、[ OK] をクリックします。[イベント ビューアー] ウィンドウで、[ アプリケーション] をクリックします。
アプリケーション ウィンドウの "WebHost" カテゴリの下に最近追加された "System.ServiceModel 4.0.0.0" イベントをダブルクリックして、安全でないエンドポイント メッセージを表示します。
サンプルを設定、ビルド、実行する
Windows Communication Foundation サンプル のOne-Time セットアップ手順を実行していることを確認します。
ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
単一または複数のコンピューター間の構成でサンプルを実行するには、「Windows Communication Foundation Samplesの実行」の手順に従います。