Это было задокументировано ранее в 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 с тремя проектами.
- Веб-приложение MVC 3, которое объединяет несколько концентраторов SignalR для связи в реальном времени через веб-устройства и мобильные устройства.
- Приложение для Windows Phone 8, которое пытается установить связь с концентраторами SignalR
- Приложение Магазина 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:
- На начальном экране Windows найдите брандмауэр Windows. Нажмите, чтобы запустить программу.
- На экране брандмауэра Windows нажмите «Дополнительные параметры».
- На экране «Брандмауэр Windows в режиме повышенной безопасности» выберите «Входящие правила». Затем нажмите Новое правило.
- На странице Тип правила мастера создания нового входящего правила выберите Порт. Затем нажмите Далее.
- На странице «Протоколы и порты» введите номер порта, который используется IIS Express, в поле «Определенные локальные порты». Затем нажмите Далее.
- На странице действий выберите Разрешить соединение. Затем нажмите Далее.
- На странице профиля выберите Личный и, если применимо, Домен. Не выбирайте Public. Затем нажмите Далее.
- На странице Имя введите имя для правила. Затем нажмите Готово.
- Теперь у вас должно быть все готово. Запустите эмулятор 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. Не забывайте переключать вещи на хост-настройки, когда вы будете удовлетворены локальным тестированием и готовы отправить его в производство.
Надеюсь, это было полезно. Прощайте!