Diensthost

Der Diensthost ist die Laufzeitumgebung zum Hosten eines Diensts innerhalb eines Prozesses.

Ein Dienst kann einen oder mehrere Endpunkte innerhalb eines Diensthosts konfigurieren.

Diagramm, das die Struktur eines Diensthosts zeigt, der einen Dienstendpunkt enthält.

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:

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:

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.