Procédure pas à pas : utilisation du transport de messagerie Exchange Server WCF

Mise à jour : novembre 2007

Vous pouvez créer des applications basées sur le transport de messagerie Exchange Server Windows Communication Foundation (WCF) pour envoyer et recevoir des messages sur les canaux d'entrée/sortie spécifiés, en utilisant un ordinateur qui exécute Microsoft Exchange Server comme médiateur. Les applications basées sur le transport de messagerie Exchange Server WCF sont prises en charge sur les ordinateurs de bureau et sur les appareils de type Smart Device.

Cette procédure pas à pas présente les fonctionnalités du transport de messagerie Exchange Server WCF. Elle illustre les tâches suivantes :

  • Configuration de votre ordinateur.

  • Génération de l'application pour l'appareil de type Smart Device (client).

  • Génération de l'application pour l'ordinateur de bureau (serveur).

Pour une liste complète du code utilisé dans ces procédures, consultez la section Exemple à la fin de cette procédure pas à pas.

Remarque :

N'utilisez pas cet exemple dans le code de production.

Composants requis

Cet exemple requiert le .NET Compact Framework version 3.5.

Configuration de votre ordinateur

Dans cette procédure, vous vérifiez que votre environnement de développement est correctement configuré pour exécuter l'exemple.

Pour configurer votre ordinateur afin d'exécuter l'exemple

  1. Installez le Kit de développement logiciel (SDK) Windows Mobile version 5.0 ou Windows Mobile 6.

    Le Kit de développement Windows Mobile 6 Professional SDK inclut la fonctionnalité AUTD d'ActiveSync utilisée par le transport de messagerie sur l'appareil pour maintenir la Boîte de réception à jour. Pour plus d'informations, consultez le site Web Windows Mobile (en anglais).

  2. Assurez-vous qu'un serveur de messagerie exécutant Microsoft Exchange Server 2007 est disponible sur le réseau.

    Si Exchange Server 2007 n'est pas disponible, vous pouvez utiliser une version d'évaluation sur Virtual PC. Pour plus d'informations, consultez le site Web Exchange Server (en anglais).

  3. Vérifiez que votre ordinateur peut se connecter au nouveau serveur de messagerie Exchange en exécutant Outlook Web Access (OWA) à partir de votre ordinateur et en vous connectant à un compte de messagerie.

  4. Assurez-vous que les services Web Exchange sont activés sur le serveur de messagerie Exchange.

    Pour ce faire, accédez à la page exchange.asmx sur le serveur de messagerie en utilisant l'une des URL suivantes : http://adresse-serveur/ews/exchange.asmx ou https://adresse-serveur/ews/exchange.asmx.

  5. Si vous utilisez l'émulateur, fournissez-lui des fonctions de réseau.

    Remarque :

    La fonctionnalité AUTD d'ActiveSync ne s'exécute pas lorsque ActiveSync fournit la connexion réseau. Vous pouvez utiliser Device Emulator 2.0, disponible dans le Kit de développement Windows Mobile 6 Professional SDK ou en tant que téléchargement, pour associer votre carte PCMCIA NE2000 à une carte réseau hôte en configurant les propriétés de l'émulateur.

  6. Lorsque l'émulateur fonctionne, configurez ActiveSync pour qu'il puisse communiquer avec votre serveur de messagerie Exchange. Pour plus d'informations, consultez la rubrique « Étape 5 : Configurer et gérer l'accès à l'appareil mobile sur le serveur Exchange » de la page Déploiement des appareils basés sur Windows Mobile 6 avec Microsoft Exchange Server 2007 sur le site Web Microsoft TechNet (en anglais).

Création de l'application pour l'appareil de type Smart Device

Dans cette procédure, vous générez une application pour l'appareil qui représente le client, puis vous créez et envoyez un message au serveur en utilisant le transport de messagerie.

Pour créer l'application pour l'appareil

  1. Créez un projet Smart Device dans Visual Studio.

  2. Ajoutez les références suivantes au projet :

    • Microsoft.ServiceModel.Mail.dll

    • Microsoft.ServiceModel.Mail.WindowsMobile.dll

    • System.ServiceModel.dll

    • System.Runtime.Serialization.dll

  3. Ajoutez la classe CFMessagingSerializer décrite dans Comment : sérialiser des messages dans des applications WCF.

    Sur l'ordinateur, vous pouvez utiliser un sérialiseur personnalisé ou des attributs pour créer des données sérialisées. Toutefois, nous vous recommandons d'utiliser le même sérialiseur pour l'appareil et l'ordinateur de bureau.

  4. Générez le message.

    Dim str As String = "Hello"
    
    String str = "Hello";
    
  5. Créez le message et sérialisez-le.

    ' Create the message.
    Dim serializer As New CFMessagingSerializer(GetType(String))
    Dim m As Message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer)
    
    // Create the message.
    CFMessagingSerializer serializer = new CFMessagingSerializer(typeof(string));
    Message m = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer);
    
  6. Créez des variables qui représentent le nom du canal, l'adresse de messagerie de l'appareil et l'adresse de messagerie du serveur.

    Dim channelName As String = "StoreandFowardMessageHelloWorld"
    Dim serverAddress As String = "ServerMailAddress@fabrikam.com"
    Dim clientAddress As String = "DeviceMailAddress@fabrikam.com"
    
    string channelName = "StoreandFowardMessageHelloWorld";
    string serverAddress = "ServerMailAddress@fabrikam.com";
    string clientAddress = "DeviceMailAddress@fabrikam.com";
    
  7. Générez le canal de sortie.

    ' Build the output channel.
    Dim binding As New WindowsMobileMailBinding()
    Dim parameters As New BindingParameterCollection()
    
    Dim channelFactory As IChannelFactory(Of IOutputChannel)
    channelFactory = binding.BuildChannelFactory(Of IOutputChannel)(parameters)
    channelFactory.Open()
    
    Dim outChannel As IOutputChannel = channelFactory.CreateChannel(New EndpointAddress(MailUriHelper.Create(channelName, serverAddress)))
    outChannel.Open()
    
    // Build the output channel.
    WindowsMobileMailBinding binding = new WindowsMobileMailBinding();
    BindingParameterCollection parameters = new BindingParameterCollection();
    
    IChannelFactory<IOutputChannel> channelFactory = binding.BuildChannelFactory<IOutputChannel>(parameters);
    channelFactory.Open();
    
    IOutputChannel outChannel = channelFactory.CreateChannel(new EndpointAddress(MailUriHelper.Create(channelName,serverAddress)));
    outChannel.Open();
    
  8. Ajoutez le code pour envoyer le message.

    ' Send the message.
    outChannel.Send(m)
    
    // Send the message.
    outChannel.Send(m);
    
  9. Générez un écouteur et ajoutez le code pour écouter la réponse.

    L'écouteur bloque l'exécution de code. Par conséquent, nous vous recommandons d'exécuter l'écouteur dans un thread séparé dans votre code de production. Dans cet exemple, ajoutez le code de l'écouteur après le code de l'expéditeur.

    ' Listen for the response.         
    Dim listener As IChannelListener(Of IInputChannel)
    listener = binding.BuildChannelListener(Of IInputChannel)(MailUriHelper.CreateUri(channelName, clientAddress))
    
    listener.Open()
    
    Dim inputChannel As IInputChannel = listener.AcceptChannel()
    inputChannel.Open()
    
    Dim reply As Message = inputChannel.Receive()
    
    // Listen for the response.         
    IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(MailUriHelper.CreateUri(channelName,clientAddress),parameters);
    listener.Open();
    
    IInputChannel inputChannel = listener.AcceptChannel();
    inputChannel.Open();
    
    Message reply = inputChannel.Receive();
    
  10. À réception d'une réponse provenant du serveur, désérialisez la réponse et présentez le résultat à l'utilisateur.

    ' When you receive a response, deserialize the message.
    str = reply.GetBody(Of String)(serializer)
    
    MessageBox.Show(str, "Received message")
    
    // When you receive a response, deserialize the message.
    str = reply.GetBody<string>(serializer);
    
    MessageBox.Show(str, "Received message");
    
  11. Nettoyez.

    outChannel.Close()
    channelFactory.Close()
    
    listener.Close()
    inputChannel.Close()
    binding.Close()
    
    outChannel.Close();
    channelFactory.Close();
    
    listener.Close();
    inputChannel.Close();
    binding.Close();
    
  12. Générez l'application cliente et déployez-la sur l'émulateur ou l'appareil que vous avez configuré pour qu'il se synchronise avec votre serveur de messagerie Exchange.

Création de l'application pour l'ordinateur

Dans cette procédure, vous générez une application pour un ordinateur de bureau qui représente le serveur dans cet exemple. Le serveur traite un message du client, l'ajoute et le renvoie au client.

Pour créer l'application pour l'ordinateur

  1. Créez une application console Windows.

  2. Ajoutez les références suivantes au projet :

    • Microsoft.ServiceModel.Mail.dll

    • Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.dll

    • System.ServiceModel.dll

    • System.Runtime.Serialization.dll

  3. Ajoutez la classe CFMessagingSerializer décrite dans Comment : sérialiser des messages dans des applications WCF.

  4. Créez quelques variables dont certaines doivent correspondre aux valeurs du projet Smart Device.

    ' Set some global variables. 
    Dim channelName As String = "StoreandFowardMessageHelloWorld"
    Dim serverAddress As String = "ServerMailAddress@fabrikam.com"
    Dim serverPWD As String = "MyPassword"
    Dim clientAddress As String = "DeviceMailAddress@fabrikam.com"
    Dim exchangeServerLocation As String = "http://fabrikam"
    
    // Set some global variables. 
    string channelName = "StoreandFowardMessageHelloWorld";
    string serverAddress = "ServerMailAddress@fabrikam.com";
    string serverPWD = "MyPassword";
    string clientAddress = "DeviceMailAddress@fabrikam.com";
    string exchangeServerLocation = "http://fabrikam";
    
  5. Créez l'écouteur.

    Si vous utilisez des informations d'identification Windows, passez une valeur Null comme deuxième argument à l'objet ExchangeWebServiceMailBinding. Comme sur l'appareil, le canal d'entrée bloque l'exécution du code. Par conséquent, nous vous recommandons de créer un thread pour chaque écouteur dans votre code de production.

    ' Create the listener. If you are using Windows credentials,
    ' pass a null value as the second argument to the ExchangeWebServiceMailBinding.
    Dim binding As MailBindingBase
    binding = New ExchangeWebServiceMailBinding(New Uri(exchangeServerLocation), New System.Net.NetworkCredential(serverAddress, serverPWD))
    Dim parameters As New BindingParameterCollection()
    
    Dim listener As IChannelListener(Of IInputChannel)
    listener = binding.BuildChannelListener(Of IInputChannel)(MailUriHelper.CreateUri(channelName, serverAddress))
    
    listener.Open()
    
    Dim inputChannel As IInputChannel = listener.AcceptChannel()
    inputChannel.Open()
    
    Dim reply As Message = inputChannel.Receive()
    
    Dim serializer As New CFMessagingSerializer(GetType(String))
    
    Dim str As String = ""
    str = reply.GetBody(Of String)(serializer)
    
    // Create the listener. If you are using Windows credentials,
    // pass a null value as the second argument to the ExchangeWebServiceMailBinding.
    MailBindingBase binding = new ExchangeWebServiceMailBinding(new Uri(exchangeServerLocation),
        new System.Net.NetworkCredential(serverAddress, serverPWD));
    BindingParameterCollection parameters = new BindingParameterCollection();
    
    IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>
        (MailUriHelper.CreateUri(channelName, serverAddress), parameters);
    listener.Open();
    
    IInputChannel inputChannel = listener.AcceptChannel();
    inputChannel.Open();
    
    Message reply = inputChannel.Receive();
    
    CFMessagingSerializer serializer = new CFMessagingSerializer(typeof(string));
    
    string str = "";
    str = reply.GetBody<string>(serializer);
    
  6. Ajoutez le code pour traiter le message.

    ' Process the message.
    str += ", World!"
    
    // Process the message.
    str += ", World!";
    
  7. Ajoutez le code pour envoyer la réponse via un canal de sortie.

    ' Send the response through an output channel.
    Dim m As Message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer)
    
    Dim channelFactory As IChannelFactory(Of IOutputChannel)
    channelFactory = binding.BuildChannelFactory(Of IOutputChannel)(parameters)
    
    channelFactory.Open()
    
    Dim outChannel As IOutputChannel = channelFactory.CreateChannel(New EndpointAddress(MailUriHelper.CreateUri(channelName, clientAddress)))
    outChannel.Open()
    
    outChannel.Send(m)
    
    // Send the response through an output channel.
    Message m = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer);
    
    IChannelFactory<IOutputChannel> channelFactory = binding.BuildChannelFactory<IOutputChannel>(parameters);
    
    channelFactory.Open();
    
    IOutputChannel outChannel = channelFactory.CreateChannel(new EndpointAddress(
        MailUriHelper.CreateUri(channelName, clientAddress)));
    outChannel.Open();
    
    outChannel.Send(m);
    
  8. Nettoyez.

    ' Clean up.
    outChannel.Close()
    channelFactory.Close()
    
    listener.Close()
    inputChannel.Close()
    binding.Close()
    
    // Clean up.
    outChannel.Close();
    channelFactory.Close();
    
    listener.Close();
    inputChannel.Close();
    binding.Close();
    
  9. Générez le projet et démarrez l'application serveur.

  10. Démarrez l'application cliente sur l'émulateur ou l'appareil.

Exemple

Description

Les exemples complets suivants montrent comment envoyer et recevoir des messages à l'aide du transport de messagerie Exchange Server WCF.

Liste de code complète pour l'appareil de type Smart Device (client)

        Dim str As String = "Hello"
        ' Create the message.
        Dim serializer As New CFMessagingSerializer(GetType(String))
        Dim m As Message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer)
        Dim channelName As String = "StoreandFowardMessageHelloWorld"
        Dim serverAddress As String = "ServerMailAddress@fabrikam.com"
        Dim clientAddress As String = "DeviceMailAddress@fabrikam.com"
        ' Build the output channel.
        Dim binding As New WindowsMobileMailBinding()
        Dim parameters As New BindingParameterCollection()

        Dim channelFactory As IChannelFactory(Of IOutputChannel)
        channelFactory = binding.BuildChannelFactory(Of IOutputChannel)(parameters)
        channelFactory.Open()

        Dim outChannel As IOutputChannel = channelFactory.CreateChannel(New EndpointAddress(MailUriHelper.Create(channelName, serverAddress)))
        outChannel.Open()
        ' Send the message.
        outChannel.Send(m)
        ' Listen for the response.         
        Dim listener As IChannelListener(Of IInputChannel)
        listener = binding.BuildChannelListener(Of IInputChannel)(MailUriHelper.CreateUri(channelName, clientAddress))

        listener.Open()

        Dim inputChannel As IInputChannel = listener.AcceptChannel()
        inputChannel.Open()

        Dim reply As Message = inputChannel.Receive()
        ' When you receive a response, deserialize the message.
        str = reply.GetBody(Of String)(serializer)

        MessageBox.Show(str, "Received message")
        outChannel.Close()
        channelFactory.Close()

        listener.Close()
        inputChannel.Close()
        binding.Close()
    End Sub
End Class
static void Main()
{
    String str = "Hello";
    // Create the message.
    CFMessagingSerializer serializer = new CFMessagingSerializer(typeof(string));
    Message m = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer);
    string channelName = "StoreandFowardMessageHelloWorld";
    string serverAddress = "ServerMailAddress@fabrikam.com";
    string clientAddress = "DeviceMailAddress@fabrikam.com";
    // Build the output channel.
    WindowsMobileMailBinding binding = new WindowsMobileMailBinding();
    BindingParameterCollection parameters = new BindingParameterCollection();

    IChannelFactory<IOutputChannel> channelFactory = binding.BuildChannelFactory<IOutputChannel>(parameters);
    channelFactory.Open();

    IOutputChannel outChannel = channelFactory.CreateChannel(new EndpointAddress(MailUriHelper.Create(channelName,serverAddress)));
    outChannel.Open();
    // Send the message.
    outChannel.Send(m);
    // Listen for the response.         
    IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(MailUriHelper.CreateUri(channelName,clientAddress),parameters);
    listener.Open();

    IInputChannel inputChannel = listener.AcceptChannel();
    inputChannel.Open();

    Message reply = inputChannel.Receive();
    // When you receive a response, deserialize the message.
    str = reply.GetBody<string>(serializer);

    MessageBox.Show(str, "Received message");
    outChannel.Close();
    channelFactory.Close();

    listener.Close();
    inputChannel.Close();
    binding.Close();
}

Liste de code complète pour l'ordinateur de bureau (serveur)

        ' Set some global variables. 
        Dim channelName As String = "StoreandFowardMessageHelloWorld"
        Dim serverAddress As String = "ServerMailAddress@fabrikam.com"
        Dim serverPWD As String = "MyPassword"
        Dim clientAddress As String = "DeviceMailAddress@fabrikam.com"
        Dim exchangeServerLocation As String = "http://fabrikam"
        ' Create the listener. If you are using Windows credentials,
        ' pass a null value as the second argument to the ExchangeWebServiceMailBinding.
        Dim binding As MailBindingBase
        binding = New ExchangeWebServiceMailBinding(New Uri(exchangeServerLocation), New System.Net.NetworkCredential(serverAddress, serverPWD))
        Dim parameters As New BindingParameterCollection()

        Dim listener As IChannelListener(Of IInputChannel)
        listener = binding.BuildChannelListener(Of IInputChannel)(MailUriHelper.CreateUri(channelName, serverAddress))

        listener.Open()

        Dim inputChannel As IInputChannel = listener.AcceptChannel()
        inputChannel.Open()

        Dim reply As Message = inputChannel.Receive()

        Dim serializer As New CFMessagingSerializer(GetType(String))

        Dim str As String = ""
        str = reply.GetBody(Of String)(serializer)
        ' Process the message.
        str += ", World!"
        ' Send the response through an output channel.
        Dim m As Message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer)

        Dim channelFactory As IChannelFactory(Of IOutputChannel)
        channelFactory = binding.BuildChannelFactory(Of IOutputChannel)(parameters)

        channelFactory.Open()

        Dim outChannel As IOutputChannel = channelFactory.CreateChannel(New EndpointAddress(MailUriHelper.CreateUri(channelName, clientAddress)))
        outChannel.Open()

        outChannel.Send(m)
        ' Clean up.
        outChannel.Close()
        channelFactory.Close()

        listener.Close()
        inputChannel.Close()
        binding.Close()
    End Sub
End Class
static void Main()
{
    // Set some global variables. 
    string channelName = "StoreandFowardMessageHelloWorld";
    string serverAddress = "ServerMailAddress@fabrikam.com";
    string serverPWD = "MyPassword";
    string clientAddress = "DeviceMailAddress@fabrikam.com";
    string exchangeServerLocation = "http://fabrikam";
    // Create the listener. If you are using Windows credentials,
    // pass a null value as the second argument to the ExchangeWebServiceMailBinding.
    MailBindingBase binding = new ExchangeWebServiceMailBinding(new Uri(exchangeServerLocation),
        new System.Net.NetworkCredential(serverAddress, serverPWD));
    BindingParameterCollection parameters = new BindingParameterCollection();

    IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>
        (MailUriHelper.CreateUri(channelName, serverAddress), parameters);
    listener.Open();

    IInputChannel inputChannel = listener.AcceptChannel();
    inputChannel.Open();

    Message reply = inputChannel.Receive();

    CFMessagingSerializer serializer = new CFMessagingSerializer(typeof(string));

    string str = "";
    str = reply.GetBody<string>(serializer);
    // Process the message.
    str += ", World!";
    // Send the response through an output channel.
    Message m = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer);

    IChannelFactory<IOutputChannel> channelFactory = binding.BuildChannelFactory<IOutputChannel>(parameters);

    channelFactory.Open();

    IOutputChannel outChannel = channelFactory.CreateChannel(new EndpointAddress(
        MailUriHelper.CreateUri(channelName, clientAddress)));
    outChannel.Open();

    outChannel.Send(m);
    // Clean up.
    outChannel.Close();
    channelFactory.Close();

    listener.Close();
    inputChannel.Close();
    binding.Close();
}

Compilation du code

L'exemple exécuté sur l'appareil requiert des références aux espaces de noms suivants :

L'exemple exécuté sur l'ordinateur requiert des références aux espaces de noms suivants :

Sécurité

La sécurité du transport de messagerie n'est pas activée dans cet exemple. Pour plus d'informations, consultez Transport de messagerie Exchange Server WCF.

Voir aussi

Tâches

Comment : utiliser la sécurité du message avec le transport de messagerie Exchange Server WCF

Autres ressources

Développement Windows Communication Foundation (WCF) et le .NET Compact Framework