Пошаговое руководство. Использование почтового транспорта WCF Exchange Server
Обновлен: Ноябрь 2007
Можно создавать приложения, основанные на Windows Communication Foundation (WCF) почтовом транспорте Exchange Server, для получения и приема сообщения по определенным входным или выходным каналам, используя компьютер, на котором запущен сервер Microsoft Exchange Server, в качестве посредника. Приложения, основанные на почтовом транспорте WCF Exchange Server, поддерживаются как настольными компьютерами, так и мобильным устройствами.
В этом пошаговом руководстве описываются возможности почтового транспорта WCF Exchange Server. В нем показаны следующие задачи.
Настройка компьютера.
Построение приложения клиента для мобильного устройства (клиентская часть).
Построение приложения клиента для настольного компьютера (серверная часть).
Полный код, показанный в данных процедурах, см. в разделе Пример в конце этого руководства.
Примечание. |
---|
Не следует использовать этот пример в рабочем коде. |
Обязательные компоненты
Для этого примера требуется .NET Compact Framework, версия 3.5.
Настройка компьютера
В этой процедуре необходимо убедиться, что интегрированная среда разработки настроена корректно для запуска этого примера.
Для настройки компьютера для запуска этого примера
Установите Windows Mobile, версия 5.0 или Windows Mobile 6 пакет средств разработки (SDK).
В пакет средств разработки Windows Mobile 6 Professional SDK входит возможность постоянного обновления ActiveSync (AUTD), которая используется почтовым транспортом на мобильном устройстве для обновления папки Входящие. Дополнительные сведения см. на веб-узле Windows Mobile.
Убедитесь, что почтовый сервер, на котором запущен Microsoft Exchange Server 2007, доступен в сети.
Если сервер Exchange Server 2007 недоступен, можно использовать пробную версию, запускаемую на виртуальном ПК. Дополнительные сведения см. на веб-узле Exchange Server.
Убедитесь, что компьютер может подключиться к новому почтовому серверу Exchange, запустив средство Outlook Web Access (OWA), и подключиться к учетной записи электронной почты.
Убедитесь, что веб-службы Exchange включены на почтовом сервере Exchange.
Один из способов сделать это — попытаться получить доступ к странице exchange.asmx на почтовом сервере с помощью одного из следующих URL-адресов: http://адрес сервера/ews/exchange.asmx или https://адрес сервера/ews/exchange.asmx.
При использовании эмулятора необходимо активировать сетевые возможности эмулятора.
Примечание. Возможность ActiveSync AUTD не работает, если ActiveSync обеспечивает сетевое подключение. Можно использовать эмулятор Device Emulator 2.0, включенный в пакет средств разработки Windows Mobile 6 Professional SDK или загружаемый отдельно, для привязки карты NE2000 PCMCIA к ведущему сетевому адаптеру, настроив параметры эмулятора.
Когда эмулятор настроен и запущен, необходимо настроить ActiveSync для связи с почтовым сервером Exchange. Дополнительные сведения см. в разделе "Шаг 5: настройка и управление доступом мобильного устройства к серверу Exchange Server" на странице Развертывание устройств под управлением Windows Mobile 6 с помощью Microsoft Exchange Server 2007 на веб-узле Microsoft TechNet.
Создание приложения для мобильного устройства
В этой процедуре происходит построение приложения для мобильного устройства, представляющее клиент, затем создание и отправление сообщения на сервер с помощью почтового транспорта.
Создание приложения для мобильного устройства
В Visual Studio создайте проект для интеллектуальных устройств.
В проекте добавьте ссылки на следующее:
Microsoft.ServiceModel.Mail.dll
Microsoft.ServiceModel.Mail.WindowsMobile.dll
System.ServiceModel.dll
System.Runtime.Serialization.dll
Добавьте класс CFMessagingSerializer, описанный в разделе Пошаговое руководство. Сериализация сообщений в приложениях WCF.
На настольном компьютере можно использовать пользовательский сериализатор или атрибуты для создания сериализованных данных. Однако рекомендуется использование одного и того же сериализатора для мобильного устройства и настольного компьютера.
Выполните построение сообщения.
Dim str As String = "Hello"
String str = "Hello";
Создайте сообщение и сериализуйте его.
' 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);
Создайте переменные, представляющие имя канала, адрес электронной почты мобильного устройства и сервера.
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";
Создайте выходной канал.
' 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();
Добавьте код для отправки сообщения.
' Send the message. outChannel.Send(m)
// 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()
// 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(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");
Выполните очистку.
outChannel.Close() channelFactory.Close() listener.Close() inputChannel.Close() binding.Close()
outChannel.Close(); channelFactory.Close(); listener.Close(); inputChannel.Close(); binding.Close();
Выполните построение клиентского приложения и разверните его на эмуляторе или устройстве, синхронизированным с почтовым сервером Exchange.
Создание приложения для настольного компьютера
В этой процедура производится построение приложения для настольного компьютера, которое в данном примере представляет серверную часть. Сервер обрабатывает сообщение от клиента, добавляет его и возвращает сообщение клиенту.
Создание приложения для настольного компьютера
Создайте новое консольное приложение Windows.
В проекте добавьте ссылки на следующее:
Microsoft.ServiceModel.Mail.dll
Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.dll
System.ServiceModel.dll
System.Runtime.Serialization.dll
Добавьте класс CFMessagingSerializer, описанный в разделе Пошаговое руководство. Сериализация сообщений в приложениях WCF.
Создайте несколько переменных, некоторые из них должны соответствовать значениям из проекта для мобильного устройства.
' 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";
Создайте прослушиватель.
При использовании учетных данных 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);
Добавьте код для обработки сообщения.
' Process the message. str += ", World!"
// 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)
// 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()
// Clean up. outChannel.Close(); channelFactory.Close(); listener.Close(); inputChannel.Close(); binding.Close();
Выполните построение проекта и запустите серверное приложение.
Запустите клиентское приложение на эмуляторе или на мобильном устройстве.
Пример
Описание
В следующих примерах показано, как отправлять и получать сообщения с помощью почтового транспорта 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.
См. также
Задачи
Другие ресурсы
Разработка Windows Communication Foundation и .NET Compact Framework