Статьи

IIS Express и эмулятор Windows Phone 8

Как разработчик приложения, вы обязательно столкнетесь с ситуацией, когда создаете как приложение, так и мобильный веб-сайт или службу на основе REST. Это означает, что вы тестируете проект ASP.net в IIS Express при использовании эмулятора Windows Phone 8, поскольку эмулятор работает как отдельное устройство в сети, и вы не можете использовать localhost для связи с сервером IIS Express.

Есть несколько способов решения этой проблемы, вы можете сначала завершить веб-проект и развернуть его на веб-сервере. Если ваш эмулятор WP8 настроен правильно, он должен иметь доступ в Интернет и сможет нормально подключаться к вашему серверу. Второй вариант — установить сервер IIS в вашей сети и развернуть его там из Visual Studio. Но наиболее простым вариантом будет использование сервера IIS Express, поставляемого с Visual Studio. Это, конечно, вариант, но требует некоторых (небольших) настроек конфигурации.

Перво-наперво

Нам понадобится веб-проект, конечно, чтобы проверить это. Я создам очень базовый проект ASP.net WebAPI и очень простое приложение для Windows Phone 8, которое будет работать в эмуляторе. Я мог бы заявить о себе на простом веб-сайте Hello World и в мобильном браузере, но это просто скучно.

Visual Studio 2012 поставляется с ASP.net MVC WebAPI, подумайте, что службы REST сделаны невероятно легко, чтобы начать проект, выберите веб-шаблон MVC4 в Visual Studio 2012 и дайте ему имя.

 

После того, как вы нажмете ОК, появится второе диалоговое окно, в котором можно запустить проект WebAPI.

Это дает вам проект MVC с контроллером API. Это ведет себя подобно обычному контроллеру, к которому вы привыкли из MVC, но вместо возврата представления он возвращает данные в формате JSON (кстати, сериализация происходит с JSON.net, а не с сериализатором .net). Я не собираюсь углубляться в WebAPI, есть много блоггеров, которые знают об этом больше, чем я. Мы будем использовать метод GET по умолчанию из ValuesController.


Фрагмент кода
// GET api/values
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

Это просто возвращает коллекцию из двух строк.

Следующий шаг — добавление в решение проекта Windows Phone 8 (простой базовый проект, запускаемый из обычного шаблона). Теперь у нас есть два проекта в одном решении, которые нужно запустить обоим. Мы можем запустить API без отладки и запустить приложение WP8 в режиме отладки, или мы можем настроить их запуск на отладку, выбрав несколько запускаемых проектов в свойствах решения.

Вы можете легко увидеть, что настройки были успешно применены, если ни один проект в решении не выделен жирным шрифтом.

Хорошо, пришло время их подключить. Нам понадобятся две вещи: IP-адрес компьютера, на котором работает IIS Express, и порт, который будет использовать проект ASP.net. Получить IP-адрес должно быть легко, просто введите ipconfig в командной строке. Чтобы узнать порт, перейдите к свойствам проекта ASP.net.

На вкладке Web свойств вы можете увидеть URL проекта для сайта, который содержит порт, который будет использоваться.

Время для некоторого кодирования, в приложении Windows Phone, добавьте константу, которая содержит URL-адрес веб-сайта.


Фрагмент кода
private const string Url = "http://192.168.0.116:7145/";

И код для получения данных REST


Фрагмент кода
private void FetchData()
{
    WebClient client = new WebClient();
 
    client.DownloadStringCompleted += ClientOnDownloadStringCompleted;
 
    client.DownloadStringAsync(new Uri(Url + "api/values"));
}

Обратный вызов будет использовать Json.net (добавленный через NuGet) для десериализации значений в List <string>, который затем устанавливается как ItemsSource для LongListSelector.


Фрагмент кода
private void ClientOnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs downloadStringCompletedEventArgs)
{
    if (downloadStringCompletedEventArgs.Error == null)
    {
        var values = JsonConvert.DeserializeObject<List<string>>(downloadStringCompletedEventArgs.Result);
 
        ValueList.ItemsSource = values;
    }
}

В общем, довольно легко, но это не сработает, потому что IIS Express привязан к localhost только по умолчанию, нам нужно изменить конфигурацию, чтобы разрешить внешние соединения.

Конфигурацию IIS Express можно найти в xml-файле applicationhost.config, который находится в папке% userprofile% \ documents \ IISExpress \ config (просто скопируйте и вставьте этот путь на начальный экран Windows 8 и нажмите клавишу ввода)

Откройте файл XML и найдите имя вашего проекта ASP.net. Это должно выглядеть примерно так


Фрагмент кода
<site name="IisExpressDemo" id="13">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="c:\users\nico\documents\visual studio 2012\Projects\IisExpressDemo\IisExpressDemo" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:7145:localhost" />
    </bindings>
</site>

Строка 6 содержит привязку, скопируйте эту строку и вставьте ее внизу, измените localhost на IP-адрес вашего компьютера, например, так:


Фрагмент кода
<site name="IisExpressDemo" id="13">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="c:\users\nico\documents\visual studio 2012\Projects\IisExpressDemo\IisExpressDemo" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:7145:localhost" />
        <binding protocol="http" bindingInformation="*:7145:192.168.0.116" />
    </bindings>
</site>

Закройте сервер IIS Express, если он все еще работает, и запустите проект.

Теперь есть большая вероятность, что вы это увидите.

Visual Studio 2012 необходимо запустить как администратор, чтобы IIS Express мог создавать привязки для внешних подключений, поэтому, если вы получите эту ошибку, закройте и перезапустите Visual Studio 2012 как администратор.

Запустите проект еще раз, и приложение Windows Phone должно получить данные из API.

Вывод

В этой статье я говорил об открытии сервера разработки IIS Express для разрешения внешних подключений. Это необходимо для того, чтобы эмулятор Windows Phone 8 мог подключаться к локальным веб-сайтам или API-интерфейсам. Это в основном два шага

  • Добавьте IP-адрес вашего компьютера в конфигурацию IIS
  • Запустите Visual Studio от имени администратора, чтобы установить привязку