Diensthost
Der Diensthost ist die Laufzeitumgebung für das 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 Servicevertrag 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 annimmt.
HRESULT hr = WsCreateServiceHost (serviceEndpoints, 1, NULL, 0, &host, error);
Eine Anwendung kann optional ein Array von Diensteigenschaften bereitstellen,WsCreateServiceHost, 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 sie schließen, wenn keine weiteren Vorgänge erforderlich sind. Beachten Sie, dass dies ihre Ressourcen nicht freigibt und dass sie mit einem nachfolgenden Aufruf von WsResetServiceHosterneut geöffnet werden kann.
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, kann sie die dem Diensthost zugeordneten Ressourcen freigeben, indem sie die WsFreeServiceHost--Funktion aufruft. Beachten Sie, dass WsCloseServiceHost- aufgerufen werden muss, bevor diese Funktion aufgerufen wird.
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 zur Implementierung von Dienstvorgängen und Serviceverträgen für einen Dienst finden Sie in den Themen Serviceoperationen und ServicevertragsThemen.
Sicherheit
Eine Anwendung kann die folgenden Eigenschaften verwenden, um die Menge der Ressourcen zu steuern, die der Diensthost im Auftrag 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.
Sichere Standardwerte werden für jede dieser Eigenschaften 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 Nachrichten spezifische Eigenschaften auch von der Anwendung geändert werden. Lesen Sie die Sicherheitsüberlegungen dieser Komponenten, bevor Sie diese 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, keine vertraulichen Daten offenzulegen. Wenn die Art der Daten, die über MEX verfügbar gemacht werden, vertraulich ist, können Anwendungen den MEX-Endpunkt mit einer sicheren Bindung konfigurieren, die mindestens eine Authentifizierung erfordert, und die Autorisierung als Teil des Endpunkts mithilfe der WS_SERVICE_SECURITY_CALLBACKimplementieren.
- Standardmäßig werden umfangreiche Fehlerinformationen über 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 und daher empfohlen werden, dass diese Einstellung nur für Debuggingszenarien geändert wird.
- Über die Überprüfung hinaus, die für die Standardprofil-2.0- und XML-Serialisierung ausgeführt wurde, führt der Diensthost keine Überprüfung der dateninhalte aus, die als Teil von Dienstvorgangsparametern empfangen wurden. 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 ihr eigenes Autorisierungsschema mithilfe von WS_SECURITY_DESCRIPTION und dem WS_SERVICE_SECURITY_CALLBACKimplementieren.
- 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 Elemente 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 geschlossen oder auf einem Endpunkt abgebrochen wird. |
Aufzählung | 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 aktuelle 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 für die Wiederverwendung zurück und setzt den zugrunde liegenden Kanal und Listener für die Wiederverwendung zurück. |
Griff | 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. |