Как отправить подписанное сообщение в службу push-уведомлений Windows Phone

Исходная статья опубликована 5 июня 2012 г.

Служба push-уведомлений — это полезный компонент Windows Phone, который позволяет отправлять всплывающие сообщения, обновлять динамические плитки и т. д. для приложения Windows Phone. Эту службу можно использовать без дополнительных протоколов защиты передачи данных, но в этом случае можно отправлять не больше 500 сообщений в день. Если со службой push-уведомлений устанавливается сеанс с взаимной проверкой подлинности с использованием протокола SSL, количество отправляемых сообщений не ограничивается. Это защищает обмен сообщениями и увеличивает его возможности. К сожалению, этот процесс задокументирован довольно плохо. Однако в социальных форумах в Центре приложений Windows Phone имеются все необходимые сведения, которые можно собрать по частям. Чтобы сэкономить ваше время на поиск этой информации, я решил собрать все сведения в этом документе. В конце концов, кто-то из группы разработчиков должен был сделать это. :-) Итак, приступим:

  1. Сведения о требованиях к сертификату, используемому для установки защищенного соединения, можно найти здесь: http://msdn.microsoft.com/en-us/library/ff941099(v=vs.92). Я обнаружил, что для этой цели подойдет любой сертификат SSL, выпущенный одним из поддерживаемых центров сертификации. Список поддерживаемых центров сертификации можно найти здесь: http://msdn.microsoft.com/en-us/library/gg521150(v=vs.92).
  2. Вы должны получить этот сертификат и отправить его в Центр приложений. Вам нужен не файл PFX с закрытым ключом, а только открытая версия сертификата (т. е. файл CER). Чтобы отправить его, зарегистрируйтесь в Центре приложений, выполните вход и щелкните имя своей учетной записи в левом верхнем углу. На странице управления учетной записью вы увидите ссылку "Сертификаты" под баннером "Моя учетная запись". Щелкните ее и следуйте инструкциям для отправки сертификата.
  3. В приложении Windows Phone создайте экземпляр класса HttpNotificationChannel. При создании экземпляра HttpNotificationChannel используйте общее имя (CN) сертификата SSL в качестве второго параметра для нового канала. Общее имя сертификата можно найти, если открыть файл CER, перейти на вкладку "Сведения" и щелкнуть свойство "Субъект". В открывшемся окне первое значение будет иметь вид "CN = www.contoso.com"; вы должны использовать только часть "www.contoso.com". Итак, команда для создания нового канала будет выглядеть следующим образом: pushChannel = new HttpNotificationChannel("myChannelName", "www.contoso.com");
    1. ПРИМЕЧАНИЕ. Если вы уже создали каналы для разных устройств, найдите свой канал с помощью метода HttpNotificationChannel.Find, а затем используйте методы .Close и .Dispose для его закрытия и ликвидации. После этого канал нужно создать повторно, чтобы связать общее имя с соединением.
  4. Сертификат, включая закрытый ключ (файл PFX), нужно установить на компьютер, на котором выполняется серверный код. Также необходимо убедиться, что учетная запись для пула приложений имеет доступ к закрытым ключам этого сертификата. Откройте средство MMC и добавьте оснастку "Сертификаты" для локального компьютера. После установки сертификата в узел "Личные" щелкните правой кнопкой мыши сертификат в MMC и выберите "Все задачи"..."Управление закрытыми ключами". После этого нужно добавить учетную запись для пула приложений, используемого вашим приложением, и предоставить ей как минимум права на чтение ключей.
    1. ПРИМЕЧАНИЕ. Если вы используете новые встроенные учетные записи в IIS 7.5, такие как ApplicationPoolIdentity, нужно предоставить доступ к IIS apppool\ASP.NET v4.0, где "ASP.NET v4.0" — имя вашего пула приложений.
  5. В код, отправляющий сообщение в службу push-уведомлений, нужно добавить сертификат для объекта HttpWebRequest. Для этого вы должны открыть хранилище X509, получить коллекцию сертификатов для хранилища "My store", выполнить поиск по отпечатку (для этого необходимо скопировать в код отпечаток из свойств сертификата), а затем использовать первый сертификат из возвращенной коллекции (т. е. myCollection[0]). Полученный сертификат можно добавить в запрос следующим образом: myRequest..ClientCertificates.Add(mySslCertificate);

Еще несколько полезных замечаний:

  • Переданный сертификат используется только четыре месяца. Если вы не отправите приложение на сертификацию в marketplace, который использует сертификат, передачу сертификата придется повторить. При отправке приложения на сертификацию в marketplace можно выбрать сертификат из списка переданных сертификатов. Просто выберите сертификат, который вы передали для данных подключений, и он будет установлен.
  • Как узнать, что все работает? При создании экземпляра класса HttpNotificationChannel в клиенте Windows Phone вы получите URI канала уведомлений, по которому отправляются ваши сообщения. Посмотрите на этот URI: если используется подключение без проверки подлинности, вы увидите в пути строку "throttledthirdparty". Если экземпляр класса создан правильно, путь будет содержать строку "unthrottledthirdparty"; кроме того, в нем будет указан протокол HTTPS, а не HTTP. Чтобы окончательно убедиться в правильности работы, после получения URI вы должны успешно отправить сообщение. Если оно приходит на ваше устройство, значит все работает правильно.

Это локализованная запись блога. Исходная статья доступна по адресу: How To Send An Authenticated Message to the Windows Phone Push Notification Service