Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
В данной статье мы рассмотрим запуск и тестирование приложения в локальной подсети, то есть как сделать приложение, запущенное в Visual Studio, доступным для всех устройств, подключенных к одной и той же сети. В данном случае речь идет не о полноценной публикации, а только о доступе в рамках подсети.
Для чего это может быть нужно? Это может быть нужно, если мы хотим протестировать наше приложение, запущенное на Visual Studio, из других устройств подсети. К примеру, я сделал мобильное приложение, которое обращается к моему же веб-приложению на ASP.NET. И мне надо протестировать взаимодействие между ними. Разворачивать полноценно веб-приложение на каком-то внешнем хостинге или локальном IIS только для этой цели не имеет смысла. И гораздо проще было бы запустить на Visual Studio веб-приложение и тут же его протестировать.
По умолчанию даже если мы запустим проект из Visual Studio на выполнение, и он запустится по какому-нибудь адресу типа http://localhost:xxxx, то на других устройствах, подключенных к одной подсети, он все равно будет не доступен. И чтобы сделать его доступным, необходимо выполнить ряд шагов. Рассмотрим два способа.
Прежде всего нам надо точно узнать адрес в под сети для того компьютера, на котором будет запускаться приложение. Это можно сделать в командной строке с помощью команды ipconfig:
Здесь нас интересует IPv4-адрес, который в моем случае равен "192.168.1.18". То есть этот адрес компьютера в локальной сети.
Теперь надо настроить приложение, чтобы оно было доступно по этому адресу.
При создании проекта asp.net mvc 5 или asp net web api соответствующие данные о нем заносятся в специальный конфигурационный файл. При работе с VS 2013 этот файл находитя по пути C:\Users\[Имя Пользователя]\Documents\IISExpress\config\applicationhost.config. А при создании приложений в VS 2015 файл будет находиться на жестком диске в каталоге проекта по пути /{каталог проекта}/.vs/config/applicationhost.config.
Откроем нужный файл в зависимости от версии Visual Studio и найдем в нем узел, который устанавливает настройки для нашего проекта. Например, в моем случае проект называется XamarinService, и нужный мне узел в файле applicationhost.config будет выглядеть следующим образом:
<site name="XamarinService" id="2"> <application path="/" applicationPool="Clr4IntegratedAppPool"> <virtualDirectory path="/" physicalPath="C:\Users\Eugene\Documents\Visual Studio 2015\Projects\ASPNETMVC5\XamarinService\XamarinService" /> </application> <bindings> <binding protocol="http" bindingInformation="*:57792:localhost" /> </bindings> </site>
В данном случае нас интересует узел bindings
, который устанавливает привязку к определенному адресу. Добавим в него новый элемент binding, в
котором будет указан наш локальный адрес в подсети:
<bindings> <binding protocol="http" bindingInformation="*:57792:localhost" /> <binding protocol="http" bindingInformation="*:57792:192.168.1.18" /> </bindings>
Следующий шаг будет состоять в открытии портов для брандмауэра Windows. Для этого нужно запустить командную строку от имени администратора и последовательно ввести следующие команды:
netsh http add urlacl url=http://192.168.1.18:57792/ user=Все
Эта команда добавляет для утилиты http.sys необходимый адрес, по которому запускается приложение. В можем случае это адрес "http://192.168.1.18:57792/".
Но естественно адрес и порт могут отличаться. Также следует отметить, что данный адрес становится доступным для всех пользователей. Для этого в конце команды идет вызов
user=Все
. "Все" - это группа пользователей. Но надо отметить, что данная часть команды будет отличаться для разных локализаций. Например, для англоязычной версии было бы:
netsh http add urlacl url=http://192.168.1.18:57792/ user=everyone
А для ОС на немецком языке
netsh http add urlacl url=http://192.168.1.18:57792/ user=Jeder
И после этого надо ввести вторую команду:
netsh advfirewall firewall add rule name="IISExpressWeb" dir=in protocol=tcp localport=57792 profile=private remoteip=localsubnet action=allow
Эта команда добавляет к файерволлу Windows новое правило, которое разрешает все входящие подключения для порта 57792 (по которому в моем случае запускается приложение) для всех устройств из локальной подсети.
И после этой настройки мы можем обратиться к запущенному приложению с любого устройства в подсети, например, с подключенного через WI-FI смартфона:
Если в будущем возникнет необходимость удалить эти установки, то это можно сделать с помощью команды:
netsh http delete urlacl url=http://192.168.1.18:57792/
Второй способ заключается в применении специального пакета для NodeJS, который называется iisexpress-proxy. В этом случае нам не надо изменять файл applicationhost.config и добавлять исключения в файерволл Windows. Соответственно, гораздо меньше вероятности где-то ошибиться, однако при этом на целевом компьютере, на котором запускается веб-приложения, должен быть установлен NodeJS.
Для установки iisexpress-proxy выполним в командной строке следующую команду:
npm install -g iisexpress-proxy
Далее, чтобы указать перенаправление с локального порта на прокси-порт, нам надо выполнить команду: iisexpress-proxy [localPort] to [proxyPort].
localPort
- это локальный порт нашего приложения, а proxyPort
- это прокси-порт (от 1025 до 65535), по которому мы будем обращаться
к приложению. Например, в моем случае это будет команда:
iisexpress-proxy 57792 to 3000
То есть все вызовы будут направляться с localhost:57792 на 192.168.1.18:3000.
При вводе этой команды может отобразиться окошко с призывом добавить исключение для файерволла:
Добавим исключение, и после этого начнет работать проксирование одного адреса на другой:
При запуске указывается, по какому адресу будет доступно приложение. То есть теперь, чтобы обратиться к приложению с другого устройства подсети, я должен буду использовать адрес http://192.168.1.18:3000.
Чтобы прекратить проксирование, достаточно нажать на Ctrl-C.