サービス ホスト
サービス ホストは、プロセス内でサービスをホストするためのランタイム環境です。
サービスは、サービス ホスト内で 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.
SOAP over UDP では一方向コントラクトのみがサポートされ、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);
カスタム状態をサービス ホストにアタッチする方法については、「ユーザー ホストの状態
特定のエンドポイントに対するサービス ホストでの承認の詳細については、「サービス承認」を参照してください。
サービスのサービス操作とサービス コントラクトの実装に関する情報については、サービス操作の およびサービス コントラクト トピック参照してください。
安全
アプリケーションでは、次のプロパティを使用して、サービス ホストがアプリケーションに代わって割り当てるリソースの量を制御できます。
- 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の | 再利用のためにサービス ホストをリセットし、基になるチャネルとリスナーをリセットして再利用します。 |
ハンドル | 形容 |
---|---|
WS_SERVICE_HOST | サービス ホストを参照するために使用される不透明な型。 |
構造 | 形容 |
---|---|
WS_SERVICE_ENDPOINT | サービス ホスト上の個々のエンドポイントを表します。 |
WS_SERVICE_ENDPOINT_PROPERTY | サービス固有の設定を指定します。 |
WS_SERVICE_PROPERTY | サービス固有の設定を指定します。 |
WS_SERVICE_PROPERTY_ACCEPT_CALLBACK | チャネルが正常に受け入れられたときに呼び出されるコールバックを指定します。 |
WS_SERVICE_PROPERTY_CLOSE_CALLBACK | チャネルが閉じようとしているときに呼び出されるコールバックを指定します。 |