Partager via


Consommation des services

par Walter Oliver

Introduction

Étant donné que l’exemple de code Hosting Services est implémenté à l’aide de Windows Communication Foundation, il est assez simple. Voici quelques points clés : Pour plus d’informations sur l’utilisation des services WCF, reportez-vous aux documentations WCF.

Configuration client

L’appel des services à partir d’une application cliente implique une configuration. Le projet SampleWebClient est un exemple de cette application. La génération du proxy pour chacun des services peut être effectuée via Visual Studio® 2005 ou à l’aide de l’utilitaire de ligne de commande SvcUtil.exe, disponible dans \Program Files\Microsoft SDKs\Windows\v6.0\Bin. La commande suivante génère le proxy pour WebManagementService.svc.

SvcUtil.exe http://<hostheader>/webmanagementservice.svc  /out:webmanagementservice.cs

La classe Proxy peut ensuite être ajoutée aux références de service du projet.

SvcUtil.exe a de nombreuses options pour contrôler la façon dont les classes proxy sont générées. Pour plus d’informations, reportez-vous aux documentations associées à SvcUtil. Dans l’exemple d’application cliente, nous utilisons l’option d’espace de noms pour dédier l’espace de noms pour les classes proxy générées afin d’éviter les conflits de classes.

La capture d’écran suivante montre un fragment des codes proxy générés :

Screenshot showing a fragment of the generated code.

Client Web.Config

Dans SampleWebClient, nous fournissons l’adresse et la liaison dans le fichier web.config du client. Notez qu’il existe des sections de liaison et de point de terminaison pour chaque classe proxy.

<binding name="WSHttpBinding_IWebManagementService" closeTimeout="00:01:00"
 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
 bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
 maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
 textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
   <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
   <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
   <security mode="Message">
      <transport clientCredentialType="Windows" proxyCredentialType="None"    realm="" />
      <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true" />
   </security>
</binding>
<endpoint address="http://HostingServices/WebManagementService.svc"
 binding="wsHttpBinding"  bindingConfiguration="WSHttpBinding_IWebManagementService"
 contract="Microsoft.Hosting.Web.Client.WebManagement.IWebManagementService" name="WSHttpBinding_IWebManagementService">
      <identity>
            <userPrincipalName value="IIS7SHWS.IIS7Live\administrator" />
      </identity>
</endpoint>

Lors du déplacement de l’application cliente d’un environnement vers un autre, assurez-vous que l’adresse du point de terminaison et userPrincipalName sont modifiés pour refléter l’environnement approprié.

Implémentation du proxy

À partir de l’application cliente, ajoutez l’espace de noms System.ServiceModel ainsi que l’espace de noms du sous-système approprié.

using System.ServiceModel;
using Microsoft.Hosting.Web.Client.WebManagement;
using Microsoft.Hosting.Web.Client.WebProvisioning;

Pour appeler un service, vous devez d’abord instancier un proxy. La ligne suivante instancie l’objet proxy pour l’opération d’approvisionnement du sous-système Web.

WebProvisioningServiceClient client = new WebProvisioningServiceClient();

Appelez la méthode à exécuter, en passant le paramètre approprié. Dans les cas où le paramètre se compose de types de données plus complexes, recherchez la définition dans la classe Data Contract correspondante.

status = client.StartSite(sitename);

Fermez ensuite le proxy. La fermeture du proxy met fin à la session avec le service et ferme la connexion.

client.Close();

Scénarios courants

La méthode CreateWebSite suivante crée un site, en fonction des propriétés de site définies dans le paramètre WebSiteProvisioningRequest .

WebProvisioningServiceClient.CreateWebSite(WebSiteProvisioningRequest request)
WebSiteProvisioningRequest exists in the Microsoft.Hosting.Web.Client.WebManagement.DataContract namespace. It is shown below.
public class WebSiteProvisioningRequest
public class WebSiteProvisioningRequest
{
    #region Fields
    private long _siteId;
    private string _siteName;
    private string _domainName;
    private string _userName;
    private string _password;
    private string _contentPath;
    private bool _useDefaultContentStructure;
    private string _physicalRootPath; 
    private string _logPath;
    private string _faultRequestsLoggingPath;
    private bool _createNewApplicationPool;
    private string _applicationPoolName;
    private bool _startSite;
    private BindingInfo _bindingInfo;
    //give the option for specifing to use an existing application pool or to create a new          application pool
    #endregion 
}

La classe WebSiteProvisioningRequest contient des propriétés pour :

  • Créer un pool d’applications
  • Créer un site
  • Créer l’application par défaut
  • Créer le répertoire virtuel par défaut
  • Ajouter les liaisons

En outre, il configure la journalisation et la journalisation des erreurs.

Exemple de code C#

L’exemple de code suivant illustre la création d’un site web à l’aide du service. Vous devez instancier le proxy WebProvisioningServiceClient . La méthode CreateWebSite(WebSiteProvisioningRequest Request) nécessite un paramètre. Tous les types de données utilisés dans les méthodes se trouvent dans la classe Data Contract correspondante. Dans ce cas, l’objet WebSiteProvisioningRequest se trouve dans l’espace de noms Microsoft.Hosting.Web.DataContract.

Les contrats d’erreur s’appliquent à tous les sous-systèmes et peuvent être implémentés comme indiqué dans le code ci-dessous.

WebProvisioningServiceClient client = new WebProvisioningServiceClient();
try
{
  BindingInfo binding = new BindingInfo();
  binding.Protocol ="http"; 
  binding.IPAddress ="*"; //all ip addresses
  binding.TCPPort = 80;
  binding.HostHeader ="www.contoso.com";
  WebSiteProvisioningRequest request = new WebSiteProvisioningRequest();
  request.SiteName ="www.contoso.com";
  request.DomainName =string.Empty;
  request.UserName ="Testuser";
  request.Password ="pass@word1";
  request.ContentPath = @"c:\contents\";
  request.UserDefaultContentStructure = false;
  request.PhysicalRootPath = @"c:\contents\www.contoso.com";
  request.LogPath = @"c:\contents\www.contoso.com\logs";
  request.FaultRequestsLoggingPath = c:\contents\www.contoso.com\logs\FailedRequestLogs";
  request.Binding = binding;
  request.CreateNewApplicationPool = true;
  request.ApplicationPoolName = "TestAppPool";
  request.StartSite = true;
  request.SiteId = 0;
  if (client.CreateWebSite(request))
  this.lblResult.Text = "Web Site: " + request.SiteName + " has been successfully created.";
  client.Close();
}
catch (FaultException<HostingServiceFault> ex)
{
  this.lblResult.Text = "FaultException<HostingServiceException>: Hosting service fault while doing " + 
  ex.Detail.Operation + ". Error: " + ex.Detail.ErrorMessage;
  client.Abort();
}
  catch (FaultException ex)
{
  this.lblResult.Text = "Add Web Site Failed with unknown faultexception: " + e.GetType().Name + " - " + ex.Message;
  client.Abort();
}
  catch (Exception ex)
{
  this.lblResult.Text = "Failed with exception: " + ex.GetType().Name + " - " + ex.Message;
  client.Abort();
}

Pour plus d’exemples, reportez-vous à l’exemple d’application cliente web incluse avec la solution Visual Studio.