Host del servizio
L'host del servizio è l'ambiente di runtime per ospitare un servizio all'interno di un processo.
Un servizio può configurare uno o più endpoint all'interno di un host del servizio.
Creazione di un host del servizio
Prima di creare un host del servizio, un servizio deve definire i relativi endpoint. Un endpoint nell'host del servizio viene specificato nella struttura WS_SERVICE_ENDPOINT e viene definito dalle informazioni seguenti:
- Indirizzo, ovvero l'URI fisico in cui verrà ospitato il servizio.
- Struttura WS_CHANNEL_TYPE che specifica il tipo del canale sottostante per l'endpoint.
- Struttura WS_CHANNEL_BINDING che specifica l'associazione del canale.
- Struttura WS_SECURITY_DESCRIPTION contenente la descrizione della sicurezza per l'endpoint.
- Struttura WS_SERVICE_CONTRACT che rappresenta il contratto di servizio per l'endpoint.
- Struttura WS_SERVICE_SECURITY_CALLBACK che specifica una funzione di callback di autorizzazione per l'endpoint.
- Struttura WS_SERVICE_ENDPOINT_PROPERTY che contiene una matrice di proprietà dell'endpoint di servizio.
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.
Sono supportati solo contratti unidirezionali per SOAP su UDP, rappresentati da WS_UDP_CHANNEL_BINDING nell'enumerazione WS_CHANNEL_BINDING .
Dopo aver definito un endpoint, può essere passato alla funzione WsCreateServiceHost , che accetta una matrice di puntatori alle strutture di WS_SERVICE_ENDPOINT .
HRESULT hr = WsCreateServiceHost (serviceEndpoints, 1, NULL, 0, &host, error);
Un'applicazione può facoltativamente fornire una matrice di proprietà del servizio a WsCreateServiceHost per configurare impostazioni personalizzate nell'host del servizio.
Un'applicazione apre l'host del servizio per avviare l'accettazione delle richieste client.
WsOpenServiceHost(serviceHost, NULL, NULL);
Dopo aver aperto l'host del servizio, l'applicazione può chiuderla se non sono necessarie altre operazioni. Si noti che questa operazione non rilascia le risorse e che può essere riaperta con una chiamata successiva a WsResetServiceHost.
WsCloseServiceHost(serviceHost, NULL, NULL);
Dopo aver chiuso l'host del servizio, un'applicazione può reimpostare l'host del servizio per il riutilizzo.
WsResetServiceHost(serviceHost, NULL);
Quando l'applicazione viene eseguita con l'host del servizio, può liberare le risorse associate all'host del servizio chiamando la funzione WsFreeServiceHost . Si noti che WsCloseServiceHost deve essere chiamato prima di chiamare questa funzione.
WsFreeServiceHost(serviceHost, NULL);
Per informazioni sul collegamento di uno stato personalizzato all'host del servizio, vedere Stato host utente
Per informazioni sull'autorizzazione in un host del servizio per un determinato endpoint, vedere Autorizzazione del servizio.
Per informazioni sull'implementazione di operazioni di servizio e contratti di servizio per un servizio, vedere gli argomenti relativi alle operazioni del servizio e al contratto di servizio.
Sicurezza
Un'applicazione può usare le proprietà seguenti per controllare la quantità di risorse allocata dall'host del servizio per conto dell'applicazione:
- 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.
Le impostazioni predefinite sicure vengono scelte per ognuna di queste proprietà, un'applicazione deve essere attenta se desidera modificare queste proprietà. Oltre alle proprietà indicate in precedenza, il canale, il listener e le proprietà specifiche dei messaggi possono essere modificate anche dall'applicazione. Fare riferimento alle considerazioni sulla sicurezza di questi componenti prima di modificare una di queste impostazioni.
Inoltre, le seguenti considerazioni sulla progettazione dell'applicazione devono essere valutate attentamente quando si usa l'API host del servizio WWSAPI:
- Quando si usa MEX, le applicazioni devono prestare attenzione a non divulgare dati sensibili. Come mitigazione, se la natura dei dati esposti tramite MEX è sensibile, le applicazioni possono scegliere di configurare l'endpoint MEX con un'associazione sicura che richiede l'autenticazione almeno e implementare l'autorizzazione come parte dell'endpoint usando il WS_SERVICE_SECURITY_CALLBACK.
- Per impostazione predefinita, le informazioni di errore avanzate tramite errori sono disabilitate nell'host del servizio tramite WS_SERVICE_PROPERTY_FAULT_DISCLOSURE proprietà. È in base alla discrezione dell'applicazione inviare informazioni di errore avanzate come parte dell'errore. Tuttavia, ciò può comportare la divulgazione di informazioni e pertanto è consigliabile che questa impostazione venga modificata solo per gli scenari di debug.
- Oltre alla convalida eseguita per la serializzazione del profilo di base 2.0 e XML, l'host del servizio non esegue alcuna convalida sul contenuto dei dati ricevuti come parte dei parametri dell'operazione di servizio. È responsabilità dell'applicazione eseguire tutte le convalida dei parametri autonomamente.
- L'autorizzazione non viene implementata come parte dell'host del servizio. Tuttavia, le applicazioni possono implementare uno schema di autorizzazione personalizzato usando WS_SECURITY_DESCRIPTION e l'WS_SERVICE_SECURITY_CALLBACK.
- È responsabilità dell'applicazione usare associazioni sicure nel relativo endpoint. L'host del servizio non fornisce alcuna sicurezza oltre a ciò che è configurato nell'endpoint.
Gli elementi API seguenti vengono usati con l'host del servizio.
Callback | Descrizione |
---|---|
WS_SERVICE_ACCEPT_CHANNEL_CALLBACK | Richiamato quando un canale viene accettato in un listener endpoint dall'host del servizio. |
WS_SERVICE_CLOSE_CHANNEL_CALLBACK | Richiamato quando un canale viene chiuso o interrotto in un endpoint. |
Enumerazione | Descrizione |
---|---|
WS_SERVICE_ENDPOINT_PROPERTY_ID | Parametri facoltativi per la configurazione di un WS_SERVICE_ENDPOINT. |
WS_SERVICE_HOST_STATE | Gli stati in cui è possibile inserire un host del servizio. |
WS_SERVICE_PROPERTY_ID | Parametri facoltativi per la configurazione dell'host del servizio. |
Funzione | Descrizione |
---|---|
WsAbortServiceHost | Interrompe e interrompe le operazioni correnti nell'host del servizio. |
WsCloseServiceHost | Chiude tutti i listener in modo che non vengano accettati nuovi canali dal client. |
WsCreateServiceHost | Crea un host del servizio. |
WsFreeServiceHost | Rilascia la memoria associata a un oggetto host del servizio. |
WsGetServiceHostProperty | Recupera una proprietà Host del servizio specificata. |
WsOpenServiceHost | Apre un host del servizio per la comunicazione e avvia i listener in tutti gli endpoint. |
WsResetServiceHost | Reimposta l'host del servizio per il riutilizzo e reimposta il canale sottostante e i listener per il riutilizzo. |
Handle | Descrizione |
---|---|
WS_SERVICE_HOST | Tipo opaco usato per fare riferimento a un host del servizio. |
Struttura | Descrizione |
---|---|
WS_SERVICE_ENDPOINT | Rappresenta un singolo endpoint in un host del servizio. |
WS_SERVICE_ENDPOINT_PROPERTY | Specifica un'impostazione specifica del servizio. |
WS_SERVICE_PROPERTY | Specifica un'impostazione specifica del servizio. |
WS_SERVICE_PROPERTY_ACCEPT_CALLBACK | Specifica il callback chiamato quando viene accettato correttamente un canale. |
WS_SERVICE_PROPERTY_CLOSE_CALLBACK | Specifica il callback che viene chiamato quando un canale sta per essere chiuso. |