Diensthost
Der Diensthost ist die Laufzeitumgebung zum Hosten eines Diensts innerhalb eines Prozesses.
Ein Dienst kann einen oder mehrere Endpunkte innerhalb eines Diensthosts konfigurieren.
Erstellen eines Diensthosts
Vor dem Erstellen eines Diensthosts muss ein Dienst seine Endpunkte definieren. Ein Endpunkt im Diensthost wird in der WS_SERVICE_ENDPOINT-Struktur angegeben und durch die folgenden Informationen definiert:
- Eine Adresse, bei der es sich um den physischen URI handelt, auf dem der Dienst gehostet wird.
- Eine WS_CHANNEL_TYPE-Struktur , die den Typ des zugrunde liegenden Kanals für den Endpunkt angibt.
- Eine WS_CHANNEL_BINDING-Struktur , die die Bindung des Kanals angibt.
- Eine WS_SECURITY_DESCRIPTION-Struktur , die die Sicherheitsbeschreibung für den Endpunkt enthält.
- Eine WS_SERVICE_CONTRACT Struktur, die den Dienstvertrag für den Endpunkt darstellt.
- Eine WS_SERVICE_SECURITY_CALLBACK-Struktur , die eine Autorisierungsrückruffunktion für den Endpunkt angibt.
- Eine WS_SERVICE_ENDPOINT_PROPERTY-Struktur , die ein Array von Dienstendpunkteigenschaften enthält.
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.
Nur unidirektionale Verträge werden für SOAP über UDP unterstützt, dargestellt durch WS_UDP_CHANNEL_BINDING in der WS_CHANNEL_BINDING-Enumeration .
Nachdem ein Endpunkt definiert wurde, kann er an die WsCreateServiceHost-Funktion übergeben werden, die ein Array von Zeigern auf WS_SERVICE_ENDPOINT Strukturen verwendet.
HRESULT hr = WsCreateServiceHost (serviceEndpoints, 1, NULL, 0, &host, error);
Eine Anwendung kann optional ein Array von Diensteigenschaften für WsCreateServiceHost bereitstellen, um benutzerdefinierte Einstellungen auf dem Diensthost zu konfigurieren.
Eine Anwendung öffnet den Diensthost, um mit der Annahme von Clientanforderungen zu beginnen.
WsOpenServiceHost(serviceHost, NULL, NULL);
Nach dem Öffnen des Diensthosts kann die Anwendung ihn schließen, wenn keine weiteren Vorgänge erforderlich sind. Beachten Sie, dass die Ressourcen nicht freigegeben werden und dass sie mit einem nachfolgenden Aufruf von WsResetServiceHost erneut geöffnet werden können.
WsCloseServiceHost(serviceHost, NULL, NULL);
Nach dem Schließen des Diensthosts kann eine Anwendung den Diensthost zur Wiederverwendung zurücksetzen.
WsResetServiceHost(serviceHost, NULL);
Wenn die Anwendung mit dem Diensthost fertig ist, können die dem Diensthost zugeordneten Ressourcen durch Aufrufen der WsFreeServiceHost-Funktion freigegeben werden. Beachten Sie, dass WsCloseServiceHost vor dem Aufrufen dieser Funktion aufgerufen werden muss.
WsFreeServiceHost(serviceHost, NULL);
Informationen zum Anfügen eines benutzerdefinierten Zustands an den Diensthost finden Sie unter Benutzerhoststatus.
Informationen zur Autorisierung in einem Diensthost für einen bestimmten Endpunkt finden Sie unter Dienstautorisierung.
Informationen zum Implementieren von Dienstvorgängen und Dienstverträgen für einen Dienst finden Sie in den Themen zu Dienstvorgängen und Dienstverträgen.
Sicherheit
Eine Anwendung kann die folgenden Eigenschaften verwenden, um die Menge der Ressourcen zu steuern, die der Diensthost im Namen der Anwendung zuweist:
- 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.
Für jede dieser Eigenschaften werden sichere Standardwerte ausgewählt. Eine Anwendung muss vorsichtig sein, wenn sie diese Eigenschaften ändern möchte. Über die oben genannten Eigenschaften hinaus können kanal-,listener- und nachrichtenspezifische Eigenschaften auch von der Anwendung geändert werden. Lesen Sie die Sicherheitsüberlegungen dieser Komponenten, bevor Sie eine dieser Einstellungen ändern.
Darüber hinaus sollten die folgenden Überlegungen zum Anwendungsentwurf bei verwendung der WWSAPI-Diensthost-API sorgfältig ausgewertet werden:
- Bei der Verwendung von MEX sollten Anwendungen darauf achten, dass sie keine sensiblen Daten offenlegen. Als Entschärfung können Anwendungen den MEX-Endpunkt mit einer sicheren Bindung konfigurieren, die mindestens eine Authentifizierung erfordert, und die Autorisierung als Teil des Endpunkts mithilfe des WS_SERVICE_SECURITY_CALLBACK implementieren.
- Standardmäßig sind umfassende Fehlerinformationen durch Fehler auf dem Diensthost durch WS_SERVICE_PROPERTY_FAULT_DISCLOSURE -Eigenschaft deaktiviert. Es liegt im Ermessen der Anwendung, umfangreiche Fehlerinformationen als Teil des Fehlers zu senden. Dies kann jedoch zu einer Offenlegung von Informationen führen. Daher wird empfohlen, diese Einstellung nur für Debugszenarien zu ändern.
- Über die Validierung hinaus, die für die Serialisierung von Basic Profile 2.0 und XML durchgeführt wurde, führt der Diensthost keine Überprüfung des Dateninhalts durch, der als Teil von Dienstvorgangsparametern empfangen wird. Es liegt in der Verantwortung der Anwendung, alle Parameterüberprüfungen eigenständig durchzuführen.
- Die Autorisierung wird nicht als Teil des Diensthosts implementiert. Anwendungen können jedoch mithilfe von WS_SECURITY_DESCRIPTION und dem WS_SERVICE_SECURITY_CALLBACK ein eigenes Autorisierungsschema implementieren.
- Es liegt in der Verantwortung der Anwendung, sichere Bindungen auf ihrem Endpunkt zu verwenden. Der Diensthost bietet keine Sicherheit, die über die auf dem Endpunkt konfigurierten Einstellungen hinausgeht.
Die folgenden API-Elemente werden mit dem Diensthost verwendet.
Rückruf | BESCHREIBUNG |
---|---|
WS_SERVICE_ACCEPT_CHANNEL_CALLBACK | Wird aufgerufen, wenn ein Kanal auf einem Endpunktlistener vom Diensthost akzeptiert wird. |
WS_SERVICE_CLOSE_CHANNEL_CALLBACK | Wird aufgerufen, wenn ein Kanal auf einem Endpunkt geschlossen oder abgebrochen wird. |
Enumeration | Beschreibung |
---|---|
WS_SERVICE_ENDPOINT_PROPERTY_ID | Optionale Parameter zum Konfigurieren einer WS_SERVICE_ENDPOINT. |
WS_SERVICE_HOST_STATE | Die -Zustände, in denen sich ein Diensthost befinden kann. |
WS_SERVICE_PROPERTY_ID | Optionale Parameter zum Konfigurieren des Diensthosts. |
Funktion | BESCHREIBUNG |
---|---|
WsAbortServiceHost | Unterbricht und beendet die aktuellen Vorgänge auf dem Diensthost. |
WsCloseServiceHost | Schließt alle Listener, sodass keine neuen Kanäle vom Client akzeptiert werden. |
WsCreateServiceHost | Erstellt einen Diensthost. |
WsFreeServiceHost | Gibt den Speicher frei, der einem Diensthostobjekt zugeordnet ist. |
WsGetServiceHostProperty | Ruft eine angegebene Diensthosteigenschaft ab. |
WsOpenServiceHost | Öffnet einen Diensthost für die Kommunikation und startet die Listener auf allen Endpunkten. |
WsResetServiceHost | Setzt den Diensthost zur Wiederverwendung zurück und setzt den zugrunde liegenden Kanal und die Listener zur Wiederverwendung zurück. |
Handle | BESCHREIBUNG |
---|---|
WS_SERVICE_HOST | Ein undurchsichtiger Typ, der verwendet wird, um auf einen Diensthost zu verweisen. |
Struktur | BESCHREIBUNG |
---|---|
WS_SERVICE_ENDPOINT | Stellt einen einzelnen Endpunkt auf einem Diensthost dar. |
WS_SERVICE_ENDPOINT_PROPERTY | Gibt eine dienstspezifische Einstellung an. |
WS_SERVICE_PROPERTY | Gibt eine dienstspezifische Einstellung an. |
WS_SERVICE_PROPERTY_ACCEPT_CALLBACK | Gibt den Rückruf an, der aufgerufen wird, wenn ein Kanal erfolgreich akzeptiert wird. |
WS_SERVICE_PROPERTY_CLOSE_CALLBACK | Gibt den Rückruf an, der aufgerufen wird, wenn ein Kanal geschlossen werden soll. |