サービス ホスト
サービス ホストは、プロセス内でサービスをホストするためのランタイム環境です。
サービスは、サービス ホスト内で 1 つ以上のエンドポイントを構成できます。
サービス ホストの作成
サービス ホストを作成する前に、サービスでエンドポイントを定義する必要があります。 サービス ホスト内のエンドポイントは 、WS_SERVICE_ENDPOINT 構造で指定され、次の情報によって定義されます。
- アドレス。これは、サービスがホストされる物理 URI です。
- エンドポイント の基 になるチャネルの種類を指定するWS_CHANNEL_TYPE構造体。
- チャネル の バインドを指定するWS_CHANNEL_BINDING構造体。
- エンドポイントのセキュリティの説明を含む WS_SECURITY_DESCRIPTION 構造体。
- エンドポイントのサービス コントラクトを表すWS_SERVICE_CONTRACT構造体。
- エンドポイントの承認コールバック関数を指定する WS_SERVICE_SECURITY_CALLBACK 構造体。
- サービス エンドポイント プロパティの配列を含む WS_SERVICE_ENDPOINT_PROPERTY 構造体。
WS_SERVICE_ENDPOINT serviceEndpoint = {0};
const WS_SERVICE_ENDPOINT* serviceEndpoints[1];
serviceEndpoints[0] = &serviceEndpoint;
WS_STRING url = WS_STRING_VALUE(L"net.tcp://+/Example");
// Method based service contract for the service
static WS_SERVICE_CONTRACT calculatorContract =
{
&calculatorContractDescription, // comes from a generated header.
NULL,
&calculatorFunctions, // specified by the application
};
serviceEndpoint.address.url = &url;
serviceEndpoint.binding.channelBinding = WS_TCP_CHANNEL_BINDING;
serviceEndpoint.contract = &calculatorContract;
serviceEndpoint.channelType = WS_CHANNEL_TYPE_DUPLEX_SESSION;
serviceEndpoint.authorizationCallback = AuthorizationCallback; // Authorization callback.
UDP 経由の SOAP では、一方向コントラクトのみがサポートされます。これは、WS_CHANNEL_BINDING列挙のWS_UDP_CHANNEL_BINDING によって表されます。
エンドポイントを定義した後は、 wsCreateServiceHost 関数に渡すことができます。この関数は、 WS_SERVICE_ENDPOINT 構造体へのポインターの配列を受け取ります。
HRESULT hr = WsCreateServiceHost (serviceEndpoints, 1, NULL, 0, &host, error);
アプリケーションは、必要に応じて WsCreateServiceHost にサービス プロパティの配列を提供して、サービス ホストでカスタム設定を構成できます。
アプリケーションによってサービス ホストが開き、クライアント要求の受け入れが開始されます。
WsOpenServiceHost(serviceHost, NULL, NULL);
サービス ホストを開いた後、必要な操作がなくなった場合、アプリケーションはそれを閉じることができます。 これによりリソースは解放されず、 WsResetServiceHost の後続の呼び出しで再度開くことができることに注意してください。
WsCloseServiceHost(serviceHost, NULL, NULL);
サービス ホストを閉じた後、アプリケーションは再利用のためにサービス ホストをリセットできます。
WsResetServiceHost(serviceHost, NULL);
アプリケーションがサービス ホストで完了すると、 WsFreeServiceHost 関数を呼び出すことによって、サービス ホストに関連付けられているリソースを解放できます。 この関数を呼び出す前に 、WsCloseServiceHost を呼び出す必要があることに注意してください。
WsFreeServiceHost(serviceHost, NULL);
カスタム状態をサービス ホストにアタッチする方法については、「ユーザー ホストの状態」を参照してください。
特定のエンドポイントのサービス ホストでの承認の詳細については、「サービスの 承認」を参照してください。
サービスのサービス操作とサービス コントラクトの実装に関する情報については、 サービス操作 と サービス コントラクトに関するトピックを参照してください。
セキュリティ
アプリケーションは、followin プロパティを使用して、サービス ホストがアプリケーションに代わって割り当てるリソースの量を制御できます。
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_ACCEPTING_CHANNELS、
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CONCURRENCY、
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CHANNELS、
- WS_SERVICE_ENDPOINT_PROPERTY_BODY_HEAP_MAX_SIZE、
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CALL_POOL_SIZE、
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CHANNEL_POOL_SIZE。
これらのプロパティごとにセキュリティで保護された既定値が選択されます。これらのプロパティを変更する場合は、アプリケーションで注意する必要があります。 上記のプロパティを超えて、 チャネル、 リスナー 、 およびメッセージ 固有のプロパティもアプリケーションによって変更できます。 これらの設定を変更する前に、これらのコンポーネントのセキュリティに関する考慮事項を参照してください。
さらに、WWSAPI サービス ホスト API を使用する場合は、次のアプリケーション設計に関する考慮事項を慎重に評価する必要があります。
- MEX を使用する場合、アプリケーションは機密データを開示しないように注意する必要があります。 軽減策として、MEX を介して公開されるデータの性質が機密性の高い場合、アプリケーションは、少なくとも認証を必要とするセキュリティで保護されたバインディングを使用して MEX エンドポイントを構成し、 WS_SERVICE_SECURITY_CALLBACKを使用してエンドポイントの一部として承認を実装することを選択できます。
- 既定では、エラーによるリッチ エラー情報は、 WS_SERVICE_PROPERTY_FAULT_DISCLOSURE プロパティによってサービス ホストで無効になっています。 障害の一部として豊富なエラー情報を送信することは、アプリケーションの裁量に基づいて行われます。 ただし、情報漏えいが発生する可能性があるため、この設定はデバッグ シナリオでのみ変更することをお勧めします。
- Basic Profile 2.0 および XML シリアル化に対して実行される検証以外に、サービス ホストはサービス操作パラメーターの一部として受信したデータ コンテンツに対して検証を実行しません。 すべてのパラメーター検証を単独で実行するのは、アプリケーションの責任です。
- 承認は、サービス ホストの一部として実装されません。 ただし、アプリケーションは、 WS_SECURITY_DESCRIPTIONとWS_SERVICE_SECURITY_CALLBACK を使用して 独自の承認スキームを実装できます。
- エンドポイントでセキュリティで保護されたバインディングを使用するのは、アプリケーションの責任です。 サービス ホストは、エンドポイントで構成されているセキュリティを超えるセキュリティを提供しません。
サービス ホストでは、次の API 要素が使用されます。
コールバック | 説明 |
---|---|
WS_SERVICE_ACCEPT_CHANNEL_CALLBACK | サービス ホストによってエンドポイント リスナーでチャネルが受け入れられたときに呼び出されます。 |
WS_SERVICE_CLOSE_CHANNEL_CALLBACK | エンドポイントでチャネルが閉じられたり中止されたりしたときに呼び出されます。 |
列挙 | 説明 |
---|---|
WS_SERVICE_ENDPOINT_PROPERTY_ID | WS_SERVICE_ENDPOINTを構成するための省略可能なパラメーター。 |
WS_SERVICE_HOST_STATE | サービス ホストが存在できることを示します。 |
WS_SERVICE_PROPERTY_ID | サービス ホストを構成するための省略可能なパラメーター。 |
機能 | 説明 |
---|---|
WsAbortServiceHost | サービス ホストに対する現在の操作を中断および中止します。 |
WsCloseServiceHost | クライアントから新しいチャネルが受け入れられないように、すべてのリスナーを閉じます。 |
WsCreateServiceHost | サービス ホストを作成します。 |
WsFreeServiceHost | サービス ホスト オブジェクトに関連付けられているメモリを解放します。 |
WsGetServiceHostProperty | 指定したサービス ホスト プロパティを取得します。 |
WsOpenServiceHost | 通信用のサービス ホストを開き、すべてのエンドポイントでリスナーを開始します。 |
WsResetServiceHost | 再利用のためにサービス ホストをリセットし、基になるチャネルとリスナーをリセットして再利用します。 |
Handle | 説明 |
---|---|
WS_SERVICE_HOST | サービス ホストを参照するために使用される不透明な型。 |
構造体 | 説明 |
---|---|
WS_SERVICE_ENDPOINT | サービス ホスト上の個々のエンドポイントを表します。 |
WS_SERVICE_ENDPOINT_PROPERTY | サービス固有の設定を指定します。 |
WS_SERVICE_PROPERTY | サービス固有の設定を指定します。 |
WS_SERVICE_PROPERTY_ACCEPT_CALLBACK | チャネルが正常に受け入れられたときに呼び出されるコールバックを指定します。 |
WS_SERVICE_PROPERTY_CLOSE_CALLBACK | チャネルが閉じようとしているときに呼び出されるコールバックを指定します。 |