Поделиться через


Пошаговое руководство. Использование почтового транспорта WCF Exchange Server

Обновлен: Ноябрь 2007

Можно создавать приложения, основанные на Windows Communication Foundation (WCF) почтовом транспорте Exchange Server, для получения и приема сообщения по определенным входным или выходным каналам, используя компьютер, на котором запущен сервер Microsoft Exchange Server, в качестве посредника. Приложения, основанные на почтовом транспорте WCF Exchange Server, поддерживаются как настольными компьютерами, так и мобильным устройствами.

В этом пошаговом руководстве описываются возможности почтового транспорта WCF Exchange Server. В нем показаны следующие задачи.

  • Настройка компьютера.

  • Построение приложения клиента для мобильного устройства (клиентская часть).

  • Построение приложения клиента для настольного компьютера (серверная часть).

Полный код, показанный в данных процедурах, см. в разделе Пример в конце этого руководства.

Bb397828.alert_note(ru-ru,VS.90).gifПримечание.

Не следует использовать этот пример в рабочем коде.

Обязательные компоненты

Для этого примера требуется .NET Compact Framework, версия 3.5.

Настройка компьютера

В этой процедуре необходимо убедиться, что интегрированная среда разработки настроена корректно для запуска этого примера.

Для настройки компьютера для запуска этого примера

  1. Установите Windows Mobile, версия 5.0 или Windows Mobile 6 пакет средств разработки (SDK).

    В пакет средств разработки Windows Mobile 6 Professional SDK входит возможность постоянного обновления ActiveSync (AUTD), которая используется почтовым транспортом на мобильном устройстве для обновления папки Входящие. Дополнительные сведения см. на веб-узле Windows Mobile.

  2. Убедитесь, что почтовый сервер, на котором запущен Microsoft Exchange Server 2007, доступен в сети.

    Если сервер Exchange Server 2007 недоступен, можно использовать пробную версию, запускаемую на виртуальном ПК. Дополнительные сведения см. на веб-узле Exchange Server.

  3. Убедитесь, что компьютер может подключиться к новому почтовому серверу Exchange, запустив средство Outlook Web Access (OWA), и подключиться к учетной записи электронной почты.

  4. Убедитесь, что веб-службы Exchange включены на почтовом сервере Exchange.

    Один из способов сделать это — попытаться получить доступ к странице exchange.asmx на почтовом сервере с помощью одного из следующих URL-адресов: http://адрес сервера/ews/exchange.asmx или https://адрес сервера/ews/exchange.asmx.

  5. При использовании эмулятора необходимо активировать сетевые возможности эмулятора.

    Bb397828.alert_note(ru-ru,VS.90).gifПримечание.

    Возможность ActiveSync AUTD не работает, если ActiveSync обеспечивает сетевое подключение. Можно использовать эмулятор Device Emulator 2.0, включенный в пакет средств разработки Windows Mobile 6 Professional SDK или загружаемый отдельно, для привязки карты NE2000 PCMCIA к ведущему сетевому адаптеру, настроив параметры эмулятора.

  6. Когда эмулятор настроен и запущен, необходимо настроить ActiveSync для связи с почтовым сервером Exchange. Дополнительные сведения см. в разделе "Шаг 5: настройка и управление доступом мобильного устройства к серверу Exchange Server" на странице Развертывание устройств под управлением Windows Mobile 6 с помощью Microsoft Exchange Server 2007 на веб-узле Microsoft TechNet.

Создание приложения для мобильного устройства

В этой процедуре происходит построение приложения для мобильного устройства, представляющее клиент, затем создание и отправление сообщения на сервер с помощью почтового транспорта.

Создание приложения для мобильного устройства

  1. В Visual Studio создайте проект для интеллектуальных устройств.

  2. В проекте добавьте ссылки на следующее:

    • Microsoft.ServiceModel.Mail.dll

    • Microsoft.ServiceModel.Mail.WindowsMobile.dll

    • System.ServiceModel.dll

    • System.Runtime.Serialization.dll

  3. Добавьте класс CFMessagingSerializer, описанный в разделе Пошаговое руководство. Сериализация сообщений в приложениях WCF.

    На настольном компьютере можно использовать пользовательский сериализатор или атрибуты для создания сериализованных данных. Однако рекомендуется использование одного и того же сериализатора для мобильного устройства и настольного компьютера.

  4. Выполните построение сообщения.

    Dim str As String = "Hello"
    
    String str = "Hello";
    
  5. Создайте сообщение и сериализуйте его.

    ' 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. Создайте переменные, представляющие имя канала, адрес электронной почты мобильного устройства и сервера.

    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. Создайте выходной канал.

    ' 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. Добавьте код для отправки сообщения.

    ' Send the message.
    outChannel.Send(m)
    
    // Send the message.
    outChannel.Send(m);
    
  9. Выполните построение прослушивателя и добавьте код для ожидания ответа.

    Прослушиватель блокирует выполнение кода. Поэтому в рабочем коде рекомендуется запускать прослушиватель в отдельном потоке. Для этого примера добавьте код прослушивателя после кода отправителя.

    ' 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. После получения ответа от сервера выполните десериализацию ответа и предоставьте результат пользователю.

    ' 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. Выполните очистку.

    outChannel.Close()
    channelFactory.Close()
    
    listener.Close()
    inputChannel.Close()
    binding.Close()
    
    outChannel.Close();
    channelFactory.Close();
    
    listener.Close();
    inputChannel.Close();
    binding.Close();
    
  12. Выполните построение клиентского приложения и разверните его на эмуляторе или устройстве, синхронизированным с почтовым сервером Exchange.

Создание приложения для настольного компьютера

В этой процедура производится построение приложения для настольного компьютера, которое в данном примере представляет серверную часть. Сервер обрабатывает сообщение от клиента, добавляет его и возвращает сообщение клиенту.

Создание приложения для настольного компьютера

  1. Создайте новое консольное приложение Windows.

  2. В проекте добавьте ссылки на следующее:

    • Microsoft.ServiceModel.Mail.dll

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

    • System.ServiceModel.dll

    • System.Runtime.Serialization.dll

  3. Добавьте класс CFMessagingSerializer, описанный в разделе Пошаговое руководство. Сериализация сообщений в приложениях WCF.

  4. Создайте несколько переменных, некоторые из них должны соответствовать значениям из проекта для мобильного устройства.

    ' 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. Создайте прослушиватель.

    При использовании учетных данных Windows передайте NULL в качестве второго аргумента объекту ExchangeWebServiceMailBinding. Как и на мобильном устройстве входной канал блокирует выполнение кода. Поэтому в рабочем коде рекомендуется создавать новый поток для каждого прослушивателя.

    ' 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. Добавьте код для обработки сообщения.

    ' Process the message.
    str += ", World!"
    
    // Process the message.
    str += ", World!";
    
  7. Добавьте код, отправляющий ответ через выходной канал.

    ' 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. Выполните очистку.

    ' 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. Выполните построение проекта и запустите серверное приложение.

  10. Запустите клиентское приложение на эмуляторе или на мобильном устройстве.

Пример

Описание

В следующих примерах показано, как отправлять и получать сообщения с помощью почтового транспорта WCF Exchange Server.

Полный пример кода для мобильного устройства (клиент).

        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();
}

Полный пример кода для настольного компьютера (сервер).

        ' 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();
}

Компиляция кода

Для примера, выполняемого на мобильном устройстве, требуются ссылки на следующие пространства имен:

Для примера, выполняемого на настольном компьютере, требуются ссылки на следующие пространства имен:

Безопасность

В этом примере безопасная передача сообщений почтового транспорта не используется. Дополнительные сведения см. в разделе Почтовый транспорт WCF Exchange Server.

См. также

Задачи

Практическое руководство. Использование безопасной передачи сообщений с помощью почтового транспорта WCF Exchange Server

Другие ресурсы

Разработка Windows Communication Foundation и .NET Compact Framework