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.

Für SOAP über UDP, dargestellt durch _ WS-UDP-KANALBINDUNG _ _ in der WS-KANALBINDUNGsenumeration, werden nur _ _ one-way-Verträge unterstützt.

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 dem Akzeptieren von Clientanforderungen zu beginnen.

WsOpenServiceHost(serviceHost, NULL, NULL);

Nach dem Öffnen des Diensthosts kann die Anwendung ihn schließen, wenn keine vorgänge mehr erforderlich sind. Beachten Sie, dass die Ressourcen nicht freigegeben werden und 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, kann sie die dem Diensthost zugeordneten Ressourcen durch Aufrufen der WsFreeServiceHost-Funktion frei geben. 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 zum Implementieren von Dienstvorgängen und Dienstverträgen für einen Dienst finden Sie in den Themen Dienstvorgänge und Dienstverträge.

Sicherheit

Eine Anwendung kann die folgenden Eigenschaften verwenden, um die Menge der Ressourcen zu steuern, die der Diensthost im Auftrag 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. Neben den oben genannten Eigenschaften 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 sorgfältig ausgewertet werden, wenn die WWSAPI-Diensthost-API verwendet wird:

  • Bei der Verwendung von MEX sollten Anwendungen darauf achten, keine vertraulichen Daten offen zu legen. Wenn die Art der über MEX verfügbar gemachten Daten 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 des WS _ SERVICE SECURITY _ _ CALLBACKimplementieren.
  • Standardmäßig sind umfangreiche Fehlerinformationen durch Fehler auf dem Diensthost durch die WS _ SERVICE PROPERTY _ FAULT _ _ DISCLOSURE-Eigenschaft deaktiviert. Es liegt im Ermessen der Anwendung, umfangreiche Fehlerinformationen als Teil des Fehlers zu senden. Dies kann jedoch zur Offenlegung von Informationen führen. Daher wird empfohlen, diese Einstellung nur für Debugszenarien zu ändern.
  • Neben der Überprüfung für Basic Profile 2.0 und XML-Serialisierung führt der Diensthost keine Überprüfung des Dateninhalts durch, der als Teil der Dienstvorgangparameter empfangen wurde. Es liegt in der Verantwortung der Anwendung, alle Parametervalidierungen selbst durchzuführen.
  • Die Autorisierung wird nicht als Teil des Diensthosts implementiert. Anwendungen können jedoch ihr eigenes Autorisierungsschema mit WS _ SECURITY _ DESCRIPTION und dem WS SERVICE SECURITY _ _ _ CALLBACK implementieren.
  • Es liegt in der Verantwortung der Anwendung, sichere Bindungen an ihrem Endpunkt zu verwenden. Der Diensthost bietet keine Sicherheit, die über das hinaus geht, was auf dem Endpunkt konfiguriert ist.

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 an einem Endpunkt geschlossen oder abgebrochen wird.
Enumeration Beschreibung
_EIGENSCHAFTEN-ID DES WS-DIENSTENDPUNKTS _ _ _ Optionale Parameter zum Konfigurieren eines _ WS-DIENSTENDPUNKTs. _
_ _ WS-DIENSTHOSTSTATUS _ Die Zustände, in denen sich ein Diensthost sein kann.
_ _ WS-DIENST-EIGENSCHAFTEN-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 einem Diensthostobjekt zugeordneten Arbeitsspeicher frei.
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 die Listener zur Wiederverwendung zurück.
Handle Beschreibung
_WS-DIENSTHOST _ Ein nicht transparenter Typ, der verwendet wird, um auf einen Diensthost zu verweisen.
Struktur Beschreibung
_WS-DIENSTENDPUNKT _ Stellt einen einzelnen Endpunkt auf einem Diensthost dar.
_ _ WS-DIENSTENDPUNKTEIGENSCHAFT _ Gibt eine dienstspezifische Einstellung an.
_WS-DIENSTEIGENSCHAFT _ Gibt eine dienstspezifische Einstellung an.
WS _ SERVICE PROPERTY ACCEPT CALLBACK (RÜCKRUF DER WS-DIENSTEIGENSCHAFT _ _ _ ANNEHMEN) Gibt den Rückruf an, der aufgerufen wird, wenn ein Kanal erfolgreich akzeptiert wird.
RÜCKRUF ZUM SCHLIEßEN _ DER WS-DIENSTEIGENSCHAFT _ _ _ Gibt den Rückruf an, der aufgerufen wird, wenn ein Kanal gerade geschlossen wird.