Il se peut que l’on soit amené pour diverse raisons à héberger un service web sur un Worker Role.

Pour ce faire, il faut créer une interface (nommée « IService » pour l’exemple) qui va définir l’ensemble des méthodes que le service WCF doit exposer.

Créer ensuite une classe (nommée « ServiceImplementation » pour l’exemple) qui implémente cette interface.

Pour exposer les méthode en http, il ne reste plus qu’à configurer un EndPoint dans la méthode OnStart() du worker Role comme suit :

public override bool OnStart()
{
    ...
    // Récupération du Endpoint configuré dans le « ServiceDefinition.csdef »
    RoleInstanceEndpoint externalEndPoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["WCFEndpoint"];
    // Formatage de l’URL du service WCF
    string endpoint = String.Format("http://{0}/service.asmx", externalEndPoint.IPEndpoint);

    // Configuration du EndPoint            
    serviceHost = new ServiceHost(typeof(ServiceImplementation), new Uri[] { new Uri(endpoint) });
    serviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
    serviceHost.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(BasicHttpSecurityMode.None), "");


    // Ajout de la publication des meta-donnée
    var useHeaderForMeta = new UseRequestHeadersForMetadataAddressBehavior();
    useHeaderForMeta.DefaultPortsByScheme.Add("http", externalEndPoint.IPEndpoint.Port);
    serviceHost.Description.Behaviors.Add(useHeaderForMeta);
    serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");


    // Ouverture du service
    serviceHost.Open();
    ...
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.