Статьи

Подключение к локальной машине из эмулятора Windows Phone 8

Это было задокументировано ранее в MSDN и нескольких других блогах; но я боролся в течение нескольких часов и просмотрел несколько ресурсов, прежде чем понять, что нужно сделать в качестве решения. Просто делюсь своим способом заставить вещи работать …

Проблема:
вы разрабатываете приложение для Windows Phone 8 с использованием эмулятора и хотите использовать / взаимодействовать со службой / веб-сайтом на локальной машине разработки. На стороне сервера имитируется серверная служба, обеспечивающая работу вашего приложения для Windows Phone; это может быть в форме веб-службы WCF или конечной точки веб-API или, в моем случае, концентратора SignalR для подключения в реальном времени. Эта, казалось бы, простая задача подключения эмулятора Windows Phone, на котором запущено приложение Phone, к сервису / веб-сайту на локальном компьютере, на самом деле оказывается сложной.

Причина:
Часть проблемы заключается в эмуляторе Windows Phone. В старом Windows Phone 7 дней эмулятор использовал сетевое соединение компьютера разработчика; это означало, что достижение чего-либо на «localhost» было тривиальным. Однако эмулятор Windows Phone 8 настраивается как отдельное устройство в сети. В результате приложение, работающее на эмуляторе Windows Phone 8, не может подключиться к компьютеру разработчика через «localhost». По сути, когда вы говорите «localhost» из приложения Windows Phone 8, вы на самом деле имеете в виду «localhost» виртуальной машины Hyper-V эмулятора Windows Phone 8, а не тот, который находится на вашей машине для разработки, на которой размещается серверная служба. , Это верно, если используется встроенный веб-сервер Casini или IIS Express. Теперь у вас есть локальный компьютер и эмулятор Windows Phone как два разных компьютера,отказываясь разговаривать друг с другом!

Мой случай: что
касается того, где я застрял — у меня есть простое решение Visual Studio с тремя проектами.

  1. Веб-приложение MVC 3, которое объединяет несколько концентраторов SignalR для связи в реальном времени через веб-устройства и мобильные устройства.
  2. Приложение для Windows Phone 8, которое пытается установить связь с концентраторами SignalR
  3. Приложение Магазина Windows 8, которое делает то же самое

Внутренний сервер SignalR использует последние биты Microsoft.AspNET.SignalR, и оба клиента имеют новейшие пакеты NuGet клиентской библиотеки SignalR .NET. Конечно, на сервере SignalR есть концентратор ChatHub, вот код, который вы ожидаете написать из клиента .NET 4.5:

IHubProxy SignalRChatHub;
HubConnection chatConnection = new HubConnection("http://localhost:53478/");
SignalRChatHub = chatConnection.CreateHubProxy("ChatHub");
await chatConnection.Start();
if (chatConnection.State == Microsoft.AspNet.SignalR.Client.ConnectionState.Connected)
{
await SignalRChatHub.Invoke("SomeMethodOnServer", "ExpectedParameters");
}

Итак, приведенный выше код соединит приложение Магазина Windows или, если на то пошло, любое приложение .NET 4.5 с внутренним сервером SignalR, работающим на вашем локальном хосте. Единственным исключением является эмулятор Windows Phone, и по причинам, о которых мы говорили выше. Итак, какой обходной путь?

Решение:
Вот серия шагов, которые я предпринял:

  • Домен отключите вашу машину разработки и отключите любое программное обеспечение VPN-туннеля. Они используют специальные протоколы IP Security, которые не нравятся WP Emulator.
  • Проверьте виртуальные сетевые коммутаторы эмулятора Windows Phone. Простой ipconfig расскажет вам, что виртуальная машина HyperV использует для соединений; скорее всего, это будет 169.254.nn.nn.
  • Следующим шагом является настройка IIS для внешнего доступа. Обычно «localhost» может быть запущен только с той же машины разработки; так что вы можете понять, почему эмулятор WP не может получить доступ к вашему серверу IIS. Выключите IIS Express, будьте смелее и отредактируйте вручную некоторые настройки. В папке «C: \ Users \\ Documents \ IISExpress \ config» находится файл «applicationhost.config», который читает IIS Express. Найдите приложение-службу бэкэнда и настройте конфигурацию, чтобы разрешить доступ с локального IP-адреса. Вот как выглядит моя:
<bindings>
<binding protocol="http" bindingInformation="*:53478:localhost" />
<binding protocol="http" bindingInformation="169.254.80.80:53478:" />
</bindings>
  • Вы заметите, что выбранная мной привязка локального IP-адреса попадает в диапазон, который будет использовать виртуальная машина эмулятора WP.

  • Теперь откройте приложение-службу через Visual Studio в режиме администратора; это важно, так как в противном случае IIS выдаст ошибку «Отказано в доступе». Запустите серверную службу и убедитесь, что она доступна как с «localhost», так и с указанного IP-адреса. Это должно работать независимо от того, есть ли у вас веб-сайт, SignalR Hub, служба WCF или конечная точка Web API.
  • Существует еще одно препятствие — даже если мы настроили IIS Express для запуска наших приложений с IP-адреса в дополнение к «localhost», он все равно будет блокировать запросы от других устройств в сети. Для этого нужно немного подправить правила брандмауэра Windows. Я цитирую MSDN, чтобы создать исключение брандмауэра для HTTP-запросов к IIS Express:

    1. На начальном экране Windows найдите брандмауэр Windows. Нажмите, чтобы запустить программу.
    2. На экране брандмауэра Windows нажмите «Дополнительные параметры».
    3. На экране «Брандмауэр Windows в режиме повышенной безопасности» выберите «Входящие правила». Затем нажмите Новое правило.
    4. На странице Тип правила мастера создания нового входящего правила выберите Порт. Затем нажмите Далее.
    5. На странице «Протоколы и порты» введите номер порта, который используется IIS Express, в поле «Определенные локальные порты». Затем нажмите Далее.
    6. На странице действий выберите Разрешить соединение. Затем нажмите Далее.
    7. На странице профиля выберите Личный и, если применимо, Домен. Не выбирайте Public. Затем нажмите Далее.
    8. На странице Имя введите имя для правила. Затем нажмите Готово.
  • Теперь у вас должно быть все готово. Запустите эмулятор WP и перейдите на ваш сайт в IE через IP — должен быть доступ к нему. Если используется конечная точка службы WCF или веб-API, обязательно добавьте ссылку, указав IP-адрес, разрешенный в IIS Express. Что касается подключения SignalR Hub от эмулятора Windows Phone, вот код, который работает:
IHubProxy SignalRMapHub;
HubConnection mapConnection = new HubConnection("http://169.254.80.80:53478");
SignalRMapHub = mapConnection.CreateHubProxy("MapHub");
public async virtual void MapIt(MapClient phoneToMap)
{
// Fire up SignalR Connection & share location. try
{
await mapConnection.Start();
if (mapConnection.State == Microsoft.AspNet.SignalR.Client.ConnectionState.Connected)
{
await SignalRMapHub.Invoke("ShowClientOnMap", phoneToMap);
}
}
catch (Exception)
{
// Do some error handling.
}
}

Итак, у вас это есть — беспрепятственное подключение к веб-сайтам / службам локальной машины разработки из эмулятора Windows Phone. Не забывайте переключать вещи на хост-настройки, когда вы будете удовлетворены локальным тестированием и готовы отправить его в производство.

Надеюсь, это было полезно. Прощайте!