Hôte de service
L’hôte de service est l’environnement d’exécution pour l’hébergement d’un service au sein d’un processus.
Un service peut configurer un ou plusieurs points de terminaison à l’intérieur d’un hôte de service.
Création d’un hôte de service
Avant de créer un hôte de service, un service doit définir ses points de terminaison. Un point de terminaison dans l’hôte de service est spécifié dans la structure WS_SERVICE_ENDPOINT et il est défini par les informations suivantes :
- Adresse, qui est l’URI physique sur lequel le service sera hébergé.
- Structure WS_CHANNEL_TYPE qui spécifie le type du canal sous-jacent pour le point de terminaison.
- Structure WS_CHANNEL_BINDING qui spécifie la liaison du canal.
- Structure WS_SECURITY_DESCRIPTION qui contient la description de sécurité du point de terminaison.
- Structure WS_SERVICE_CONTRACT qui représente le contrat de service pour le point de terminaison.
- Structure WS_SERVICE_SECURITY_CALLBACK qui spécifie une fonction de rappel d’autorisation pour le point de terminaison.
- Structure WS_SERVICE_ENDPOINT_PROPERTY qui contient un tableau de propriétés de point de terminaison de service.
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.
Seuls les contrats unidirectionnels sont pris en charge pour SOAP sur UDP, représentés par WS_UDP_CHANNEL_BINDING dans l’énumération WS_CHANNEL_BINDING.
Une fois qu’un point de terminaison est défini, il peut être passé à la fonction WsCreateServiceHost, qui prend un tableau de pointeurs vers WS_SERVICE_ENDPOINT structures.
HRESULT hr = WsCreateServiceHost (serviceEndpoints, 1, NULL, 0, &host, error);
Une application peut éventuellement fournir un tableau de propriétés de service à WsCreateServiceHost pour configurer des paramètres personnalisés sur l’hôte de service.
Une application ouvre l’hôte de service pour commencer à accepter les demandes clientes.
WsOpenServiceHost(serviceHost, NULL, NULL);
Après avoir ouvert l’hôte de service, l’application peut la fermer s’il n’y a plus d’opérations qui le nécessitent. Notez que cela ne libère pas ses ressources et qu’elle peut être rouverte avec un appel ultérieur à WsResetServiceHost.
WsCloseServiceHost(serviceHost, NULL, NULL);
Après avoir fermé l’hôte de service, une application peut réinitialiser l’hôte de service à des fins de réutilisation.
WsResetServiceHost(serviceHost, NULL);
Lorsque l’application est terminée avec l’hôte de service, elle peut libérer les ressources associées à l’hôte de service en appelant la fonction WsFreeServiceHost. Notez que WsCloseServiceHost doit être appelée avant d’appeler cette fonction.
WsFreeServiceHost(serviceHost, NULL);
Pour plus d’informations sur l’attachement d’un état personnalisé à l’hôte de service, consultez 'état de l’hôte utilisateur
Pour plus d’informations sur l’autorisation dans un hôte de service pour un point de terminaison donné, consultez d’autorisation de service.
Pour plus d’informations sur l’implémentation des opérations de service et des contrats de service pour un service, consultez les rubriques opérations de service et contrat de service.
Sécurité
Une application peut utiliser les propriétés de suivi pour contrôler la quantité de ressources allouées par l’hôte de service pour le compte de l’application :
- 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.
Les valeurs par défaut sécurisées sont choisies pour chacune de ces propriétés, une application doit être prudente si elle souhaite modifier ces propriétés. Au-delà des propriétés mentionnées ci-dessus, canal, écouteur et message propriétés spécifiques peuvent également être modifiées par l’application. Reportez-vous aux considérations de sécurité de ces composants avant de modifier l’un de ces paramètres.
En outre, les considérations de conception d’application suivantes doivent être soigneusement évaluées lors de l’utilisation de l’API hôte du service WWSAPI :
- Lorsque vous utilisez MEX, les applications doivent faire attention à ne pas divulguer de données sensibles. En guise d’atténuation, si la nature des données exposées via MEX est sensible, les applications peuvent choisir de configurer le point de terminaison MEX avec une liaison sécurisée nécessitant une authentification au moins et implémenter l’autorisation dans le cadre du point de terminaison à l’aide du WS_SERVICE_SECURITY_CALLBACK.
- Par défaut, les informations d’erreur enrichies par le biais d’erreurs sont désactivées sur l’hôte de service par WS_SERVICE_PROPERTY_FAULT_DISCLOSURE propriété. Il est à la discrétion de l’application d’envoyer des informations d’erreur enrichies dans le cadre de l’erreur. Toutefois, cela peut entraîner la divulgation d’informations et il est donc recommandé que ce paramètre soit modifié uniquement pour les scénarios de débogage.
- Au-delà de la validation effectuée pour la sérialisation BASIC Profile 2.0 et XML, l’hôte de service n’effectue aucune validation sur le contenu des données reçues dans le cadre des paramètres d’opération de service. Il incombe à l’application d’effectuer toutes les validations de paramètres par elle-même.
- L’autorisation n’est pas implémentée dans le cadre de l’hôte de service. Toutefois, les applications peuvent implémenter leur propre schéma d’autorisation à l’aide de WS_SECURITY_DESCRIPTION et du WS_SERVICE_SECURITY_CALLBACK.
- Il incombe à l’application d’utiliser des liaisons sécurisées sur son point de terminaison. L’hôte de service ne fournit aucune sécurité au-delà de ce qui est configuré sur le point de terminaison.
Les éléments d’API suivants sont utilisés avec l’hôte de service.
Rappel | Description |
---|---|
WS_SERVICE_ACCEPT_CHANNEL_CALLBACK | Appelé lorsqu’un canal est accepté sur un écouteur de point de terminaison par l’hôte de service. |
WS_SERVICE_CLOSE_CHANNEL_CALLBACK | Appelé lorsqu’un canal est fermé ou abandonné sur un point de terminaison. |
Énumération | Description |
---|---|
WS_SERVICE_ENDPOINT_PROPERTY_ID | Paramètres facultatifs pour la configuration d’un WS_SERVICE_ENDPOINT. |
WS_SERVICE_HOST_STATE | Indique qu’un hôte de service peut se trouver. |
WS_SERVICE_PROPERTY_ID | Paramètres facultatifs pour la configuration de l’hôte de service. |
Fonction | Description |
---|---|
WsAbortServiceHost | Interrompt et interrompt les opérations actuelles sur l’hôte de service. |
WsCloseServiceHost | Ferme tous les écouteurs afin qu’aucun nouveau canal ne soit accepté par le client. |
WsCreateServiceHost | Crée un hôte de service. |
WsFreeServiceHost | Libère la mémoire associée à un objet hôte de service. |
WsGetServiceHostProperty | Récupère une propriété hôte de service spécifiée. |
WsOpenServiceHost | Ouvre un hôte de service pour la communication et démarre les écouteurs sur tous les points de terminaison. |
WsResetServiceHost | Réinitialise l’hôte de service pour la réutilisation et réinitialise le canal et les écouteurs sous-jacents pour la réutilisation. |
Manche | Description |
---|---|
WS_SERVICE_HOST | Type opaque utilisé pour référencer un hôte de service. |
Structure | Description |
---|---|
WS_SERVICE_ENDPOINT | Représente un point de terminaison individuel sur un hôte de service. |
WS_SERVICE_ENDPOINT_PROPERTY | Spécifie un paramètre spécifique au service. |
WS_SERVICE_PROPERTY | Spécifie un paramètre spécifique au service. |
WS_SERVICE_PROPERTY_ACCEPT_CALLBACK | Spécifie le rappel appelé lorsqu’un canal est accepté avec succès. |
WS_SERVICE_PROPERTY_CLOSE_CALLBACK | Spécifie le rappel appelé lorsqu’un canal est sur le point d’être fermé. |