Exporter (0) Imprimer
Développer tout

Étape 3 : Implémenter un contrat de service WCF REST pour utiliser Service Bus

Mis à jour: juin 2014

Voici la troisième des quatre tâches nécessaires à la création d'un service Service Bus de type REST. Pour obtenir une vue d'ensemble de toutes les tâches, voir la rubrique Didacticiel REST pour Service Bus. La création d'un service Service Bus de type REST nécessite de d'abord créer le contact, qui est défini à l'aide d'une interface. Pour en savoir plus sur Pour plus d'informations sur la création de l'interface, voir l'Étape 2 : Définir un contrat de service WCF REST pour utiliser Service Bus. L'étape suivante, présentée dans cet exemple, consiste à implémenter l'interface. Cela implique la création d'une classe nommée ImageService qui implémente l'interface IImageContract définie par l'utilisateur. Après avoir implémenté le contrat, vous pouvez configurer l'interface à l'aide du fichier App.config. Le fichier de configuration contient les informations nécessaires pour l'application, tel que le nom du service, le nom du contrat et le type de protocole qui est utilisé pour communiquer avec le Service Bus. Le code utilisé pour ces tâches est fourni dans l'exemple suivant la procédure.

Comme pour les étapes précédentes, l'implémentation d'un contrat de type REST et un contrat Service Bus de base comportent peu de différences.

Durée estimée : 10 minutes

  1. Créez une nouvelle classe nommée ImageService directement sous la définition de l'interface IImageContract. La classe ImageService implémente l'interface IImageContract.

    class ImageService : IImageContract
    {
    }
    

    Comme pour les autres implémentations d'interface, vous pouvez implémenter la définition dans un fichier différent. Cependant, pour ce didacticiel, l'implémentation apparaît dans le même fichier que la définition de l'interface et la méthode Main().

  2. Appliquez l'attribut ServiceBehaviorAttribute à la classe IImageService pour indiquer que la classe est une implémentation d'un contrat WCF :

    
    [ServiceBehavior(Name = "ImageService", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
    class ImageService : IImageContract
    {
    }
    
    

    Comme nous l’avons déjà indiqué, cet espace de noms n'est pas un espace de noms traditionnel. À la place, il fait partie de l'architecture WCF qui identifie le contrat. Voir Pour plus d'informations, consultez la rubrique Noms de contrat de données dans la documentation WCF.

  3. Ajoutez une image .jpg à votre projet.

    Il s'agit d'une image que le service affiche dans le navigateur de réception. Cliquez avec le bouton droit de la souris sur votre projet, puis cliquez sur Ajouter. Puis cliquez sur Élément existant. Utilisez la boîte de dialogue Ajouter un élément existant pour rechercher un fichier .jpg approprié, puis cliquez sur Ajouter. Un exemple de fichier .jpg est disponible à l'adresse <SDKInstallDir>\Samples\ServiceBus\ExploringFeatures\Bindings\WebHttp\CS35\Service\image.jpg.

    Lors de l'ajout du fichier, assurez-vous que l'option Tous les fichiers (*.*) est sélectionné dans la liste déroulante à côté de Nom de fichier : . La suite de ce didacticiel suppose que le nom de l'image est « image.jpg ». Si vous avez un fichier .jpg différent, vous devrez renommer l'image ou changer votre code pour compenser.

  4. Pour vous assurer que le service d'exécution peut trouver le fichier de l'image, dans l'Explorateur de solutions, cliquez avec le bouton droit sur le fichier de l'image. Dans le volet Propriétés, définissez Copier vers le répertoire de sortie sur Copier si nouveau.

  5. Ajoutez des références aux assemblys System.Drawing.dll, System.Runtime.Serialization.dll et Microsoft.ServiceBus.dll au projet, et aussi à ces instructions using associées.

    using System.Drawing;
    using System.Drawing.Imaging;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Web;
    
    
  6. Définissez un constructeur qui charge le bitmap et prépare l'envoi au navigateur client :

    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";
    
        Image bitmap;
    
        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }
    }
    
    
    
  7. Directement sous le code précédent, ajoutez la méthode GetImage suivante dans la classe ImageService pour renvoyer un message HTTP qui contient l'image :

    public Stream GetImage()
    {
       MemoryStream stream = new MemoryStream();
       this.bitmap.Save(stream, ImageFormat.Jpeg);
    
       stream.Position = 0;
       WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
    
       return stream;
    }
    

    Cette implémentation utilise MemoryStream pour récupérer l'image et la préparer à une diffusion en continu dans le navigateur. Elle commence la position de flux sur zéro, déclare le contenu du flux en tant .jpeg et diffuse l'information.

  8. Dans le menu Générer, cliquez sur Générer la solution pour générer la solution dans son intégralité.

  1. Cliquez avec le bouton droit sur le projet Écouteur d'image. Puis cliquez sur Ajouter, Nouvel élément.

  2. Dans la boîte de dialogue Ajouter un nouvel élément, dans le volet Modèles, sélectionnez Configuration de l'application. Puis cliquez sur Ajouter.

    Le fichier de configuration ressemble à un fichier de configuration WCF et inclut le nom du service, le point de terminaison (c'est-à-dire l'emplacement que le Service Bus expose pour que les clients et les hôtes communiquent entre eux) et la liaison (le type de protocole qui est utilisé pour communiquer). La grande différence ici, c'est que le point de terminaison du service configuré fait référence à une liaison WebHttpRelayBinding, qui ne fait pas partie du . WebHttpRelayBinding est une des nouvelles liaisons introduites avec le Service Bus. Pour en savoir plus sur Pour plus d'informations sur la configuration d'une application Service Bus, voir Configuration d'un service WCF pour s'inscrire auprès de Service Bus.

  3. Dans l'Explorateur de solutions, cliquez sur App.config, qui contient actuellement les éléments XML suivants :

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    </configuration>
    
  4. Ajoutez un élément XML au fichier App.config pour system.serviceModel. Il s'agit d'un élément WCF qui définit un ou plusieurs services. Ici, il sert à définir le nom du service et le point de terminaison.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        
      </system.serviceModel>
      
    </configuration>
    
  5. Dans l'élément system.serviceModel, ajoutez un élément <bindings> qui a le contenu suivant. Il définit les liaisons utilisées dans l’application. Vous pouvez définir plusieurs liaisons, mais dans ce le cadre de ce didacticiel, seule une liaison sera définie.

    <bindings>
      <!-- Application Binding -->
      <webHttpRelayBinding>
        <binding name="default">
          <security relayClientAuthenticationType="None" />
        </binding>
      </webHttpRelayBinding>
    </bindings>
    

    Cette étape définit une liaison Service Bus WebHttpRelayBinding avec le relayClientAuthenticationType comme None. Ceci indique qu'un point de terminaison utilisant cette liaison ne nécessitera pas d'informations d'identification du client.

  6. Sous l'élément <bindings>, ajoutez un élément <services>. Comme pour les liaisons, vous pouvez définir plusieurs services dans un seul fichier de configuration. Cependant, dans le cadre de ce didacticiel, vous ne définirez qu'un seul service.

    <services>
      <!-- Application Service -->
      <service name="Microsoft.ServiceBus.Samples.ImageService"
               behaviorConfiguration="default">
        <endpoint name="RelayEndpoint"
                  contract="Microsoft.ServiceBus.Samples.IImageContract"
                  binding="webHttpRelayBinding"
                  bindingConfiguration="default"
                  behaviorConfiguration="sharedSecretClientCredentials"
                  address="" />
      </service>
    </services>
    

    Cette étape configure un service qui utilise le webHttpRelayBinding précédemment défini par défaut. Il utilise aussi le sharedSecretClientCredentials par défaut, qui est défini dans la prochaine étape.

  7. Sous l'élément <services>, créez un élément <behaviors>, avec le contenu suivant, en remplaçant “ISSUER_NAME” et “ISSUER_SECRET” par, respectivement, votre nom et secret d'émetteur.

    <behaviors>
      <endpointBehaviors>
        <behavior name="sharedSecretClientCredentials">
          <transportClientEndpointBehavior credentialType="SharedSecret">
            <clientCredentials>
              <sharedSecret issuerName="ISSUER_NAME" issuerSecret="ISSUER_SECRET" />
            </clientCredentials>
          </transportClientEndpointBehavior>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="default">
          <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    

    Le comportement sharedSecretClientCredentials définit le type d'informations d'identification que le service utilise pour accéder au Service Bus : SharedSecret. De plus, les noms et secrets d'émetteur actuels sont sauvegardés dans le fichier App.config. Notez que le stockage de secrets en texte clair n'est pas considéré comme une bonne pratique de programmation pour le code de production. Assurez-vous d'implémenter une sécurité plus stricte dans votre propre code.

    Ce code définit également le comportement de débogage par défaut, qui consiste à désactiver les pages d'aide HTTP et HTTPS.

  8. Dans le menu Générer, sélectionnez Générer la solution pour générer la solution dans son intégralité.

Exemple

Le code suivant montre l'implémentation du service et du contrat pour un service REST qui s'exécute sur le Service Bus à l'aide de la liaison WebHttpRelayBinding.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Web;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Web;

namespace Microsoft.ServiceBus.Samples
{
    

    [ServiceContract(Name = "ImageContract", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IImageContract
    {
        [OperationContract, WebGet]
        Stream GetImage();
    }

    public interface IImageChannel : IImageContract, IClientChannel { }

    [ServiceBehavior(Name = "ImageService", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")]
    class ImageService : IImageContract
    {
        const string imageFileName = "image.jpg";

        Image bitmap;

        public ImageService()
        {
            this.bitmap = Image.FromFile(imageFileName);
        }

        public Stream GetImage()
        {
            MemoryStream stream = new MemoryStream();
            this.bitmap.Save(stream, ImageFormat.Jpeg);

            stream.Position = 0;
            WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";

            return stream;
        }    
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

L'exemple suivant affiche le fichier App.config associé au service.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <!-- Application Binding -->
      <webHttpRelayBinding>
        <binding name="default">
          <!-- Turn off client authentication so that client does not need to present credential through browser or fiddler -->
          <security relayClientAuthenticationType="None" />
        </binding>
      </webHttpRelayBinding>
    </bindings>

    <services>
      <!-- Application Service -->
      <service name="Microsoft.ServiceBus.Samples.ImageService"
               behaviorConfiguration="default">
        <endpoint name="RelayEndpoint"
                  contract="Microsoft.ServiceBus.Samples.IImageContract"
                  binding="webHttpRelayBinding"
                  bindingConfiguration="default"
                  behaviorConfiguration="sharedSecretClientCredentials"
                  address="" />
      </service>
    </services>

    <behaviors>
      <endpointBehaviors>
        <behavior name="sharedSecretClientCredentials">
          <transportClientEndpointBehavior credentialType="SharedSecret">
            <clientCredentials>
              <sharedSecret issuerName="ISSUER_NAME" issuerSecret="ISSUER_SECRET" />
            </clientCredentials>
          </transportClientEndpointBehavior>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="default">
          <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>
</configuration>

Maintenant que vous avez configuré et implémenté le contrat de service Web, passez à l'Étape 4 : Héberger le service WCF REST pour utiliser Service Bus.

Microsoft réalise une enquête en ligne pour recueillir votre opinion sur le site Web de MSDN. Si vous choisissez d’y participer, cette enquête en ligne vous sera présentée lorsque vous quitterez le site Web de MSDN.

Si vous souhaitez y participer,
Afficher:
© 2014 Microsoft