Мобильная платформа WCF: Создание приложения для обмена мгновенными сообщениями с помощью .NET Compact FrameworkДобро пожаловать | ВходРоссия - русский Argentina (Español)Australia (English)Brasil (Português)Canada (English)Canada (Français)中国 (简体中文)Colombia (Español)Deutschland (Deutsch)España (Español)France (Français)India (English)Italia (Italiano)México (Español)Perú (Español)Россия (Pусский)United Kingdom (English)United States (English)Дополнительно… | Microsoft.com ПродуктыOfficeWindowsWindows Server SystemДля разработчиковMicrosoft DynamicsРесурсыMicrosoft UpdateOffice UpdateЦентр загрузкиСправка и поддержкаБезопасностьЛицензированиеО корпорации MicrosoftО компанииПресс-службаПолезные ссылкиIT-профессионаламБезопасность домаКрупному бизнесуМалому бизнесуMicrosoft для партнеровВсе продуктыКарта сайта.scopeArrow{margin-top: -1px;padding-top: 2px;padding-right: 18px;}.TabStrip_SearchBox{padding: 0px 2px 0 2px;height: 19px;} Поиск по MSDNПоиск по Microsoft.comПоиск Windows LiveMSDN MagazineHomeSubscribeReader ServicesCommunityCurrent Issue| Topics| Issues| Authors| Columns| Html Help Files| Code Downloads| RSS .tbfont{ font-size: 70%;} версия для печати ОтправитьЩелкните, чтобы оценить и отправить отзыв Отправить отзыв на это содержаниеMSDNГлавная страница MSDNБиблиотека MSDNОбучение MSDNФайлы для загрузки MSDNПоддержка MSDNСообщество MSDNDeveloper Centers.NET FrameworkASP.NETOfficeSQL ServerVisual BasicVisual C++Visual C#Visual StudioVisual Studio ExpressWindows VistaMoreMSDN MagazineHomeSubscribeReader ServicesCommunityHomeCurrent IssueTopicsIssuesAuthorsColumnsHtml Help FilesCode DownloadsRSSIssues2008200720062005200420032002200120002008AprilMarchLaunchFebruaryJanuaryLaunchМобильная платформа WCF: Создание п...IIS 7.0: Построение решений веб-сер...VSTO 3.0: Разработка бизнес-приложе...Модульное тестирование: Применение ...Первое знакомство с F#: Использован...Колонка редактора: Надвигается волн...Инструментарий: Автозавершение кода...На переднем крае: Модальные диалого...Тестовый прогон: Пользовательская а...Коварный код: Советы, приемы работы...Станция техобслуживания: Фабрика We...Системы Foundation: Службы рабочих ...Windows и C++: Улучшения служб Wind...Team System: Примечания и политики ...{ End Bracket }: Цифровая Деклараци... Мобильная платформа WCF: Создание п...Share this PageLive FavoritesDotNet KicksDiggSlashdotdel.icio.usNingTechnoratima.gnoliaredditRelated ArticlesОтвет: Создание потоков работ голосового интерфейса при помощи Speech Server 2007Система Speech Server 2007, объединяя средства Microsoft .NET Framework и Visual Studio, позволяет создавать сложные приложения с голосовым интерфейсом. В статье описано, как это делается.By Michael Dunn (April 2008)Производительность: Стратегии масштабирования для приложений ASP.NETПроблемы с производительностью могут поразить веб-приложения при их масштабировании вверх и, в таком случае, возникает необходимость найти причины этого, а также лучшие стратегии их устранения.By Richard Campbell and Kent Alstad (April 2008)Silverlight: Создание сложной трехмерной анимации с помощью Silverlight 2.0Выполнять анимацию с помощью Silverlight проще, чем кажется. В этой статье демонстрируется создание приложения трехмерной графики, складывающего многогранник с помощью XAML и C#, а также имитации математических библиотек DirectX.By Declan Brennan (April 2008)Поездки: Подготовка мобильных устройств.Узнайте, как можно настроить все мобильные устройства в своей компании с помощью нескольких строчек кода и небольшого количества XML – благодаря интерфейсам API подготовки в комплекте SDK для Windows Mobile.By Mike Calligaro (April 2008)More ...Popular ArticlesПоездки: Подготовка мобильных устройств.Узнайте, как можно настроить все мобильные устройства в своей компании с помощью нескольких строчек кода и небольшого количества XML – благодаря интерфейсам API подготовки в комплекте SDK для Windows Mobile.By Mike Calligaro (April 2008)Объединение WCF: Программирование HTTP с использованием WCF и .NET Framework 3.5Внедрение ориентированных на веб-технологии компонентов Windows Communication Foundation в среду .NET Framework 3.5, включая модель программирования HTTP и новый интерфейс API объединения.By Justin Smith (January 2008)Разработка Office: Шаблоны решений OBA в реальном миреШаблоны решений OBA облегчают архитекторам и разработчикам создание бизнес-приложений Office (OBA). В данной статье представляются семь основных шаблонов решений OBA, один из которых применяется для решения реальной задачи.By Steve Fox (March 2008)VSTO 3.0: Разработка бизнес-приложений на основе Office с помощью Visual Studio 2008Пользовательские области формы в Outlook позволяют получать данные из назначенных источников данных и полностью настраивать пользовательский интерфейс Outlook 2007.By Steve Fox (Launch 2008)More ...Read the BlogBjarne Stroustrup interviewRecently, our Editor in Chief Howard Dierking had the pleasure of talking to Bjarne Stroustrup, the creator of C++, about a host of topics, from his thoughts on languages to general industry trends to his own personal reading list. We feature the interview in the April ...Read more!Free tools you may have missedScott Mitchell in our Toolbox column has covered quite a few free tools you’ll love. Here are some you may have missed from Scott and some of our other authors as well. Check back again for more free tools next time. SubSonic is an application toolset that is centered on its ability to completely ...Read more!Building Voice Response WorkflowsNeed an interactive voice response application for your organization's phone system? Office Communications Server (OCS) 2007 Speech Server introduces a .NET Framework API for creating IVR applications, plus a visual IVR application designer based on Windows Workflow Foundation. In the April 2008 issue of MSDN ...Read more!Windows with C++: Windows Imaging Component BasicsThe Microsoft Windows Imaging Component (WIC) is an extensible framework for encoding, decoding, and manipulating images. WIC supports different image formats using an extensible set of imaging codecs. Each codec supports a different image format and typically provides both an encoder and decoder. In the April 2008 issue of MSDN ...Read more!April 2008 issue of MSDN Magazine now onlineThe April 2008 issue of MSDN Magazine is now available online. In the April issue, we take a look at some new technologies like voice apps and Silverlight animations, plus a look back at performance and scaling optimization. ...Read more!LINQ coverage in March MSDN MagazineIn the March 2008 installment of the Advanced Basics column in MSDN Magazine, Ken Getz shows you how to programmatically interact with the Office Open XML File Formats ...Read more!More ...Мобильная платформа WCF
Создание приложения для обмена мгновенными сообщениями с помощью .NET Compact Framework
Эндрю Арнот (Andrew Arnott)
В статье рассматривается:
Почтовые транспорты в .NET Compact Framework
Создание простых приложений для обмена мгновенными сообщениями
Внутреннее устройство механизма коммуникации системы обмена сообщениями WCF
Использование веб-службы WCF
Продукты и технологии:
.NET Compact Framework 3.5, Visual Studio 2008
СодержаниеПочтовые транспорты
Написание приложения для Windows Mobile
Механизм коммуникации системы обмена сообщениями WCF
Создание и отправка сообщения
Создание настольного приложения
Запуск примера
Вызов служб WCF
Создание класса прокси
Использование службы WCF
Проблема адресуемости мобильных устройств традиционно затрудняла создание приложений Windows Mobile®, получающих данные с серверов. Небольшие устройства часто не имеют связанных с ними статических IP-адресов или динамических записей DNS. Обычным решением является отправка устройством запроса HTTP серверу после подключения к сети, а сервер переводит запрос в режим ожидания до передачи каких-либо данных устройству. Затем сервер отвечает на этот длительный запрос обновлением, а устройство обрабатывает обновление и отправляет новый запрос для ожидания следующего обновления.
Это решение может вызывать проблемы масштабируемости на сервере, поскольку оно устанавливает в режим ожидания множество запросов вместо того, чтобы сразу же отвечать на них и закрывать подключения. Это также может привести к снижению срока службы аккумулятора устройства, которое должно быть включено для поддержания подключения. Если при отправке сервером обновления устройство будет выключено, сервер не сможет его отправить и должен будет удалить его или поддерживать состояние каждого обновления для каждого устройства. Наконец, при отсутствии доступа к сети приложение не может отправлять и получать сообщения.
Visual Studio® 2008 предоставляет разработчикам приложений Windows Mobile возможность доступа к набору функций Windows® Communication Foundation (WCF) с помощью Microsoft® .NET Compact Framework 3.5, которая разрешает множество подобных проблем с помощью двух новых элементов привязки к WCF, упрощающих отправку и получение сообщений благодаря использованию в качестве транспорта электронной почты. Поскольку множество устройств имеют встроенные функции синхронизации электронной почты, эти транспорты используют преимущество постановки в очередь, свойственное электронной почте, и доступность существующих серверов в Интернете для создания адресуемой очереди сообщений, обеспечивающей одноранговую связь, связь устройство-сервер и сервер-устройство на уровне сообщений, основанную на действительной передаче сообщений. В данной статье я рассмотрю набор функций WCF, поддерживаемый .NET Compact Framework 3.5, а также использование этих транспортов и средств в приложениях для мобильных устройств.
Почтовые транспорты
Материалы по .NET Compact Framework
Блог группы разработчиков .NET Compact Framework
Распространяемый пакет .NET Compact Framework 3.5 и Power Toys
Отдельные блоги, относящиеся к разработке для .NET Compact Framework:
blogs.msdn.com/andrewarnottmsblogs.msdn.com/markprenticemsblogs.msdn.com/davidklinemsjmpinline.nerdbank.net
В состав платформы .NET Compact Framework 3.5 входят транспорты WindowsMobileMailTransport для обмена сообщениями на платформе Windows Mobile и ExchangeWebServiceMailTransport для обмена сообщениями на платформах Windows для настольных систем. Два транспорта взаимодействуют таким образом, что вся связь между устройствами, между компьютерами или между устройствами и компьютерами осуществляется незаметно. Поскольку несколько приложений могут одновременно использовать почтовый транспорт для одного и того же получателя, можно указать имя почтового канала для обозначения сообщений для вашего приложения и сообщений для других приложений. Затем это имя канала включается в тему каждого сообщения. В результате почтовый транспорт будет открывать только те сообщения, тема которых соответствует имени прослушиваемого канала.
Почтовый транспорт для устройств Windows Mobile, входящий в состав .NET Compact Framework 3.5, лучше всего работает на устройствах Windows Mobile с поддержкой функции DirectPush, позволяющей соответствующему серверу Exchange Server передавать сообщения системе Windows Mobile сразу же после их получения получения. Для получения дополнительных сведений о функции DirectPush (также известной как Always-Up-To-Date) и ее установке на устройствах Windows Mobile посетите веб-узел msexchangeteam.com/archive/2004/04/26/120520.aspx.
Если вы знакомы с очередью сообщений Microsoft (MSMQ), почтовый транспорт очень сходен с ней, за исключением того, что не имеет проблем с адресуемостью устройств. Хранилища почты на устройстве и сервере Exchange Server выступают в качестве очередей сообщений. Адреса электронной почты каждого устройства и сервера выступают в качестве URI-адреса очереди.
Необходимо отметить, что хотя теоретически два устройства, использующие WindowsMobileMailTransport, могут использовать любые серверы SMTP/POP3 для связи, в настоящее время в .NET Compact Framework 3.5 в качестве почтового сервера поддерживается только Exchange Server 2007. Кроме того, не поддерживаются особые устройства под управлением Windows CE.
Чтобы продемонстрировать работу транспортов, я создам два небольших приложения и использую электронную почту для отправки сообщений, подобных мгновенным, между устройством Windows Mobile и компьютером. Почтовые транспорты поддерживают только однонаправленный обмен сообщениями (в отличие от обмена сообщениями типа запрос-ответ), что хорошо подходит для приложений обмена мгновенными сообщениями.
Прежде всего необходимо установить Visual Studio 2008 и определить целевое устройство. Это целевое устройство, физическое или эмулируемое, должно быть настроено на использование учетной записи почты Exchange Server 2007. Эти действия необходимо выполнить до тестирования приложения. При настройке эмулируемого устройства его необходимо оставить работающим или сохранить состояние до закрытия — в противном случае настройка учетной записи почты будет утеряна. Если вы забудете это, то, вероятно, обнаружите, что сообщения накапливаются в папке исходящих сообщений устройства и никуда не передаются.
Перед началом работы убедитесь, что установлен Центр устройств Windows Mobile 6.1 или ActiveSync® 4.5. Это ПО можно загрузить с веб-узла microsoft.com/activesync.
При работе с Windows Vista® для настройки почты проще всего открыть диспетчер Device Emulator Manager и вставить эмулятор в подставку. После подключения устройства должен открыться Центр устройств Windows Mobile. Если Центр устройств Windows Mobile установлен, но не распознает подключенный эмулятор, откройте Центр устройств Windows Mobile через меню «Пуск». В параметрах мобильного устройства проверьте «Параметры подключения» и убедитесь, что установлен флажок «Разрешить подключения одного из следующих типов:», и в раскрывающемся списке выбрано DMA.
Нажмите кнопку «Настройка устройства» и убедитесь, что установлен хотя бы один флажок электронной почты. Затем укажите данные для прямого подключения устройства (или эмулятора) к Exchange. Это позволит программе отправлять и получать сообщения при наличии сети даже при отсутствии подключения. Остается только настроить партнерство с устройством или эмулятором.
При использовании почтового транспорта с личным адресом электронной почты можно настроить правило Exchange для перенаправления всех сообщений, тема которых начинается с «SM», в другую папку. Почтовые транспорты .NET Compact Framework 3.5 проверяют наличие сообщений WCF только в двух папках, «Входящие» и «Служебная электронная почта», поэтому сообщения WCF необходимо хранить в одной из этих двух папок.
Написание приложения для Windows Mobile
Написание приложения для Windows Mobile начинается с создания проекта Visual C#® для смарт-устройств. Дайте проекту имя DeviceMessagingApp, а решению – MsdnMessagingSample, как показано на рис. 1. После этого появится еще одно диалоговое окно, в котором можно выбрать целевую платформу и версию .NET Compact Framework. Выберите платформу Windows Mobile 6 Professional SDK, а для версии .NET Compact Framework установите 3.5. Если пункт Windows Mobile SDK отсутствует, посетите веб-узел go.microsoft.com/fwlink/?LinkID=81684 и загрузите набор средств разработки Windows Mobile SDK, затем установите его и вернитесь к данному этапу.
0) this.src=small; if (current.indexOf(small) > 0)this.src=large;" />
Рис. 1 Настройка проекта (Щелкните изображение, чтобы увеличить его)
Должен открыться конструктор форм Visual Studio 2008, в котоорм будут отображены устройство Windows Mobile и пустая основная форма. Для написания простой программы для беседы поместите в форму несколько элементов управления TextBox и Label. Для свойства TextBox.ReadOnly текстового поля журнала можно установить значение True, чтобы предотвратить случайный ввод. Для свойства TextBox.Multiline поля журнала необходимо установить значение True. Добавьте к меню кнопку «Отправить», чтобы ее можно было нажать с помощью клавиши устройства. Теперь моя самая любимая операция: для свойства Form.MinimizeBox установите значение False, чтобы кнопка X в углу изменилась на «ok» — в этом случае при нажатии данной кнопки приложение будет закрыто, а не скрыто. В итоге ваш проект должен выглядеть примерно так, как показано на рис. 2.
Рис. 2 Интерфейс приложения
Поскольку будет использоваться версия Compact Framework среды WCF, необходимо добавить несколько ссылок на сборки. В обозревателе решений щелкните папку References проекта правой кнопкой мыши, затем выберите «Add Reference» (Добавить ссылку). На вкладке .NET выберите следующие сборки:
System.ServiceModel.dll
System.Runtime.Serialization.dll
Microsoft.ServiceModel.Channels.Mail.dll
Microsoft.ServiceModel.Channels.Mail.WindowsMobile.dll
Для ввода текста сообщений в WCF используется реализация абстрактного класса XmlObjectSerializer. В состав версии WCF для настольных систем входит класс DataContractSerializer, порожденный от данного класса. В версию Compact среды WCF не входит DataContractSerializer, поэтому необходимо использовать XmlSerializer. Поскольку XmlSerializer не порожден от XmlObjectSerializer, что требуется WCF, можно написать порожденный от него небольшой класс и просто вызвать XmlSerializer для выполнения тяжелой работы.
Добавьте к проекту новый класс с именем MessageSerializer, порожденный от XmlObjectSerializer. Если в исходном файле щелкнуть имя базового класса правой кнопкой мыши, Visual Studio предожит автоматически установить заглушки вместо всех функций, которые необходимо реализовать. К этому классу необходимо только добавить несколько строк кода, как показано на рис. 3. Этот код определяет конструктор, инициализирующий XmlSerializer и реализующий методы ReadObject и WriteObject. Метод WriteObject необходимо написать самостоятельно.
Figure 3 XmlObjectSerializerusing System;
using System.Runtime.Serialization;
using System.Xml.Serialization;
class MessageSerializer : XmlObjectSerializer {
XmlSerializer serializer;
public MessageSerializer(Type type) {
serializer = new XmlSerializer(type);
}
public override void WriteObject(
System.Xml.XmlDictionaryWriter writer, object graph) {
serializer.Serialize(writer, graph);
}
public override object ReadObject(
System.Xml.XmlDictionaryReader reader,
bool verifyObjectName) {
return serializer.Deserialize(reader);
}
// ...
}
Методы, добавленные к вашему классу Visual Studio, которые здесь не указаны, могут просто выдавать исключение NotImplementedException, поскольку WCF никогда не вызывает их.
Механизм коммуникации системы обмена сообщениями WCF
Для отправки и получения сообщений необходимо инициализировать канал почты WCF. Поскольку в .NET Compact Framework 3.5 не реализованы многие из классов Service Model, входящих в состав версии WCF для настольных систем, необходимо использовать интерфейс API обмена сообщениями, для чего необходимо написание дополнительного кода. Этот код необходимо написать не зависимым от платформы образом, вызывая только интерфейс API WCF, предоставленный .NET Compact Framework, чтобы его можно было использовать как в приложениях для устройств, так и в настольных приложениях, обеспечивая простоту и небольшой размер всех приложений.
Добавьте новый файл класса с именем Messaging.cs. В этот файл будет входить класс Messaging, который будет содержать всё необходимое для отправки и получения сообщений. В реальном приложении размер этого класса может быть гораздо большим в целях повышения безопасности и масштабируемости потока, но я сохраню краткость моего примера, чтобы уделить основное внимание рассматриваемой задаче.
Я сделал класс Messaging общим классом Messaging, где T – это тип передаваемых между приложениями данных (см. рис. 4). В более сложных приложениях можно передавать несколько типов объектов и различать сообщения с помощью строки Action, но в данном примере я не буду этого делать. Для этого класса подходит любое значение T, которое можно сериализовать с помощью XmlSerializer.
Figure 4 Простой класс обмена сообщениямиusing Microsoft.ServiceModel.Channels.Mail;
class Messaging {
public delegate void IncomingMessageCallback(T body);
public const string DeviceSendChannel = "toDesktop";
public const string DesktopSendChannel = "toDevice";
public Messaging(MailBindingBase binding,
string sendChannelName, string listenChannelName,
IncomingMessageCallback incomingMessageCallback) {
// ...
}
public void SendMessage(string recipient, T body) {
// ...
}
public void Close() {
// ...
}
}
Класс Messaging содержит два метода для отправки и получения сообщений. Получение сообщений осуществляется с помощью фонового потока, прослушивающего сообщения и вызывающего метод обратного вызова при поступлении сообщения. Потребуется создание канала в конструкторе и предоставление метода Close для разрыва канала при закрытии приложения.
Поскольку существует два класса привязки почты (один для настольных систем, а второй для мобильных устройств), данный класс использует привязку в качестве аргумента для конструктора. Для использования одной учетной записи электронной почты для настольной системы и устройства, чтобы два приложения не выполняли чтение входящих сообщений друг друга, необходимо использовать различные имена каналов для настольной системы и устройства — поэтому конструктор также будет использовать их в качестве аргументов.
Итак, мы создали базовую структуру нашего класса, как показано на рис. 4. После написания данного скелетного кода можно перейти к написанию оставшихся частей приложения устройства и настольного приложения. Полная реализация класса Messaging.cs включена в исходный код, прилагаемый к данной статье. Он практически полностью состоит из обычного кода уровня обмена сообщениями WCF без учета почтового транспорта.
Следующий этап — создание и разрыв канала почты. Откройте код основной формы (Form1.cs). Необходимо инициализировать канал почты в конструкторе и разорвать его при закрытии формы. Для начала добавьте поле, которое будет отслеживать экземпляр Messaging. Поскольку приложение осуществляет связь с помощью текстовых сообщений, вместо T укажем string:
Messaging messaging;
Инициализация данного поля скоро будет выполнена. Поскольку для конструктора Messaging требуется обратный вызоа, сначала определяется совместимый метод:
void incomingMessage(string message) {
}
Теперь инициализируем поле messaging в конструкторе. Необходимо соблюдать порядок двух имен каналов, чтобы приложение устройства отправляло сообщения, используя имя DeviceToDesktopChannel, а прослушивало имя DesktopToDeviceChannel. Тогда устройство не будет получать сообщения, отправленные им настольной системе, даже если для устройства и настольной системы используется один адрес электронной почты:
messaging = new Messaging(
new WindowsMobileMailBinding(),
Messaging.DeviceToDesktopChannel,
Messaging.DesktopToDeviceChannel,
(Messaging.IncomingMessageCallback)incomingMessage);
Закройте канал при выходе приложения в обработчике событий Form.Closed. Метод Form1_Closed должен вызывать только метод Close объекта Messaging:
void Form1_Closed(object sender, EventArgs e) {
messaging.Close();
}
Создание и отправка сообщения
Приложение для устройства почти готово. Остается только реализовать отправку сообщений и ответ на них. Необходимо добавить обработчик для кнопки «Отправка». Обработчик событий должен вызывать SendMessage объекта Messaging, а затем очищать текстовое поле сообщения, информируя пользователя об отправке сообщения, например:
void sendMenuItem_Click(object sender, EventArgs e) {
messaging.SendMessage(toTextBox.Text, messageTextBox.Text);
messageTextBox.Text = "";
}
Это было просто. Теперь остается только ответить на входящие сообщения, реализовав метод incomingMessage (см. рис. 5). Подвох состоит в том, что этот ответный вызов выполняется из фонового потока, прослушивающего новые сообщения, но к текстовому полю журнала беседы необходимо добавить текст из потока пользовательского интерфейса. Проверьте свойство InvokeRequired, чтобы выяснить, находитесь ли вы в фоновом потоке; если да, вызовите Invoke для вызова метода обратного вызова из потока пользовательского интерфейса. На потоке пользовательского интерфейса просто добавьте входящее сообщение к полю беседы и убедитесь, что поле журнала достаточно прокручивается, чтобы можно было прочитать последнее сообщение.
Figure 5 Ответ на входящие сообщенияvoid incomingMessage(string message) {
// Invoke ourselves on the UI thread
if (InvokeRequired) {
Invoke((Messaging.IncomingMessageCallback)
incomingMessage, message);
} else {
// append incoming message to message history
historyTextBox.Text += message + Environment.NewLine;
// scroll to end of history window
historyTextBox.Select(historyTextBox.Text.Length, 0);
historyTextBox.ScrollToCaret();
}
}
На этом завершается создание приложения для устройства. Если на устройствах используются различные учетные записи электронной почты, для которых настроены верные имена каналов, это приложение – всё, что необходимо для организации обмена мгновенными сообщениями между устройствами. Но вернемся к ситуации с одним устройством и настольной системой и только одним адресом электронной почты.
Создание настольного приложения
Добавьте в ваше решение новый проект приложения для WPF. Если пункт для создания такого проекта, убедитесь, что в раскрывающемся списке в правом верхнем углу диалогового окна «Add New Project» (Добавление нового проекта) выбрано .NET Framework 3.5. С таким же успехом можно применять приложение Windows Forms, но в этих примерах будет использоваться новая технология. Дайте проекту имя DesktopMessagingApp.
Перетащите в конструктор форм элементы управления, использовавшиеся в приложении для устройства. Если вы раньше не работали с WPF, не пугайтесь, что внешний вид конструктора изменился. Кроме того, для поля журнала в WPF не требуется устанавливать свойство TextBox.Multiline.
Результат должен выглядеть примерно так, как показано на рис. 6. Если вы предпочитайте просто ввести для этой формы код XAML, он включен в исходный код, прилагаемый к данной статье.
0) this.src=small; if (current.indexOf(small) > 0)this.src=large;" />
Рис. 6 Основной пользовательский интерфейс настольного приложения (Щелкните изображение, чтобы увеличить его)
К проекту для настольной системы добавьте несколько эталонных сборок, как это делалось в проекте для устройства. Необходимо добавить ссылки на следующие сборки:
System.ServiceModel.dll
System.Runtime.Serialization.dll
Microsoft.ServiceModel.Channels.Mail.dll
Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.dll
Далее, свяжите файлы MessageSerializer.cs и Messaging.cs, созданные в проекте для устройства, с проектом для настольной системы. Щелкните правой кнопкой мыши DesktopMessagingApp в проводнике по решениям, затем выберите «Add | Existing Item» (Добавить | Существующий элемент). Выберите каталог приложения для устройства. Выберите файлы MessageSerializer.cs и Messaging.cs, но не нажимайте кнопку «Add» (Добавить). Вместо этого щелкните стрелку вниз справа от кнопки и выберите «Add As Link» (Добавить как ссылку). Это позволяет использовать исходные файлы в двух проектах.
Единственный подвох состоит в том, что поскольку исходные файлы были созданы в проекте для устройства, пространство имен для общих классов совпадает с пространством имен проекта для устройства. Если это вас слишком беспокоит, пространство имен для этих классов можно изменить на какое-нибудь более распространенное. Кроме того, эти два исходных класса можно поместить в общий проект библиотеки (будьте внимательны, чтобы не установить ссылку на сборку ExchangeWebService.dll или WindowsMobile.dll).
Создание и освобождение канала почты для настольного приложения аналогичны приложению для устройства за исключением того, что создается экземпляр ExchangeWebServiceMailBinding, а не WindowsMobileMailBinding. Стоит также обратиить внимание, что хотя WindowsMobileMailBinding просто использовал почтовый ящик на устройстве (или эмуляторе), для ExchangeWebServiceMailBinding необходимы сетевые учетные данные. Предполагая, что учетные данные аналогичны учетным данным для входа в сеть, можно просто передать null конструктору ExchangeWebServiceMailBinding, чтобы сервер Exchange Server выполнял проверку подлинности, используя встроенную безопасность Windows. Можно сохранить эту схему (что более безопасносно), жестко закодировать имя пользователя и пароль или запрашивать учетные данные пользователя во время выполнения до создания экземпляра Messaging.
Другое отличие двух классов привязки почты: WindowsMobileMailBinding немедленно уведомляется при получении ActiveSync нового сообщения, а ExchangeWebServiceMailBinding должен периодически вызывать веб-методы для запроса новых сообщений; можно принять период по умолчанию в 30 секунд или установить его самостоятельно.
Для начала добавим в файл фонового кода Window1.xaml.cs следующие два поля. Установите для сервера Exchange собственный URL-адрес веб-клиента Microsoft Outlook®:
Messaging messaging;
readonly Uri exchangeUrl = new Uri("https://mail.wingtiptoys.com");
Так же, как и при написании приложения устройства, создадим метод получения сообщений, чтобы его можно было передавать как обратный вызов к конструктору Messaging:
void incomingMessage(string message) {
}
Можно создать экземпляр класса Messaging в конструкторе Window1, передавая ему привязку почты Exchange (см. рис. 7). Следующий этап очень важен: измените порядок имен каналов в приложении для устройства. Изменение порядка позволяет настольной системе получать сообщения с устройства, а устройству получать сообщения с настольной системы. Если не изменить порядок каналов, обе стороны будут отправлять сообщения на одном канале и прослушивать на другом канале — получение сообщений станет невозможным.
Figure 7 Запуск привязки почтового транспортаpublic Window1() {
InitializeComponent();
ExchangeWebServiceMailBinding binding =
new ExchangeWebServiceMailBinding(exchangeUrl, null);
((ExchangeWebServiceMailTransport)
binding.Transport).ServerQueryInterval = 2000;
messaging = new Messaging(
binding,
Messaging.DesktopToDeviceChannel,
Messaging.DeviceToDesktopChannel,
incomingMessage);
}
Чтобы вам не пришлось ждать 30 секунд для просмотра результатов, в данном примере я установил интервал опроса сервера Exchange Server, равный двум секундам. Будьте внимательны: установка интервала опроса, равного двум секундам, в производственном приложении может привести к возникновению проблемы масштабируемости.
Для закрытия канала необходимо установить связь с методом для реагирования на событие Window.Closed. Откройте код XAML в файле Window1.xaml и добавьте атрибут Closed="Window_Closed" к открывающему тегу . У вас должно получиться приблизительно следующее:
Добавьте метод Window_Closed к файлу фонового кода Window1.xaml, затем вызовите метод Close для объекта Messaging, как показано ниже
void Window_Closed(object sender, EventArgs e) {
messaging.Close();
}
И вновь остается только реализовать отправку сообщений и ответ на них. Добавьте обработчик для кнопки меню «Отпарвить», дважды щелкнув ее в конструкторе. Вызовите SendMessage и очистите текстовое поле со введенным пользователем сообщением, чтобы проинформировать пользователя об отправке сообщения:
void sendButton_Click(object sender, RoutedEventArgs e) {
messaging.SendMessage(toBox.Text, messageBox.Text);
messageBox.Clear();
}
Для реализации метода incomingMessage опять необходимо учитывать, что он будет вызываться из фонового потока, и вам необходимо вызвать его для потока поль