Freigeben über


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.

Diagramm mit der Struktur eines Diensthosts, 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 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:

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.