IISExpress возвращает ошибку 503 с удаленных машин

183

Я пытаюсь протестировать веб-сайт, который я использую в локальном экземпляре IISExpress, с некоторыми другими машинами / устройствами в моей локальной сети. Я использую Win7 Pro.

Когда я впервые пытаюсь перейти на свой компьютер с другого компьютера в моем сегменте локальной сети, я получаю сообщение об ошибке 400: имя хоста неверно.

Я понимаю, что мне нужно предоставить удаленный доступ к ACL с помощью команды в командной строке с повышенными правами, например:

netsh http add urlacl url=http://mymachinename:50333/ user=everyone

Теперь я получаю 503 сервис недоступна ошибка.

Брандмауэр Windows в настоящее время отключен, и я могу просмотреть свой локальный экземпляр IISExpress по адресу http://localhost:50333

Какова последняя часть этой головоломки конфигурации?

Джефф Фриц
источник
1
Что произойдет, если вы перейдете http://mymachinename:50333/ с вашего компьютера?
полковник Паник
1
Проблема была решена. Смотрите принятый ответ от vikomall
Джефф Фриц
1
Более глубокое обсуждение этого здесь: hanselman.com/blog/…
Крис Москини
3
Вы можете установить наше бесплатное расширение VS «Конвейер», чтобы обойти эту проблему marketplace.visualstudio.com/…
Джим У говорит, что восстановите Монику

Ответы:

270

Похоже, вам не хватает обязательной информации в файле applicationhost.config.

  1. Откройте файл applicationhost.config. Возможные места:

    • %userprofile%\Documents\IISExpress\config\applicationhost.config
    • $(solutionDir)\.vs\config\applicationhost.config (VS2015)
    • В противном случае, проверьте вывод от, iisexpress.exeчтобы быть уверенным.
  2. Найдите свою запись на веб-сайте и добавьте следующую привязку с именем вашего компьютера.

         <binding protocol="http" bindingInformation=":50333:your-machine-name" />
    
  3. Перезапустите IIS Express

vikomall
источник
9
Неважно. Visual Studio создала дублирующую запись конфигурации для элемента. Я удалил это, и это сработало.
nuzzolilo
3
IIS Express не всегда использует файл конфигурации по этому пути. iisexpress.exeВнимательно прочитайте вывод, чтобы увидеть, какой файл конфигурации он использует.
полковник Паник
5
Ключевой пункт 3, перезапустите IIS Express! Найдите значок в системном трее и остановите его, чтобы перезапустить. Не уверен, что есть более элегантный способ. Но это сработало для меня. Спасибо!
Сенатор
9
Если вам лень добавлять каждую комбинацию имя хоста / ipaddress, используйте * вместо «your-machine-name»
StarQuake
4
Еще один совет: если вы щелкнете правой кнопкой мыши по иконке систрейса IISExpress, вы можете выбрать «Показать все приложения», чтобы открыть диалоговое окно, показывающее все приложения, которые вы в данный момент используете локально. Щелкните правой кнопкой мыши нужное приложение (не щелкайте левой кнопкой мыши, иначе откроется браузер), затем вы увидите «Путь» и «Конфигурация» ниже. Щелкните левой кнопкой мыши «Config», и он откроет связанный файл Applicationhost.config, где вам нужно добавить / отредактировать привязки, как описано выше. Это простой способ найти текущую конфигурацию.
Мэтт
31

Была только одна вещь, которая работала на меня.

использование *:portnumber:*было бесполезно. Да, после того, как я это сделал и убедился, что брандмауэр Windows открыт, я смог подключиться к порту, но все равно получил ошибку «503».

Я проверил несколько вещей локально и обнаружил, что работает только http: // localhost . Используя реальный IP-адрес (не 127.0.0.1, а, например, 192.168.1.50), все равно вернул 503 даже на локальном компьютере. Я пытался использовать настоящее имя хоста в привязках, но IIS Express отказался запускаться. На самом деле это может быть связано с тем, как разрешается имя хоста. Я не исследовал это дальше.

Наконец, я закончил с использованием этой конфигурации:

<binding protocol="http" bindingInformation="*:53351:localhost" />
<binding protocol="http" bindingInformation="192.168.1.50:53351:*" />

Таким образом, я смог подключиться с удаленного компьютера с помощью http://192.168.1.50:53351.

Ящерица
источник
Я попал в эту точную ошибку, но не хотел жестко закодировать текущий IP-адрес в конфиг, так как он может измениться. Я обнаружил, что подстановочные знаки работают с частями IP и имени хоста, поэтому я закончил: <binding protocol="https" bindingInformation="*:44300:*" /> <binding protocol="http" bindingInformation="*:8888:*" /> edit: действительно пытался понять УДАЧУ, я ушел :).
Брайан Баркер
19

Потратив более 3 часов на такой полный предмет, я решил поделиться с вами своими настройками. Моя конфигурация - Visual Express 2012 для веб-обновления 4 на Windows 8. Это было мое первое возвращение в MS VS со времен обучения (не менее 8 лет), и теперь я уверен, что правила Linux. На django такой вид установки занял у меня 10 минут поиска документации.

  1. выключите брандмауэр для тестирования

    netsh advfirewall set allprofiles state off
    
  2. привязки установки в моем случае локальным адресом является localIP = 192.168.1.102 (поскольку ссылки не могут содержать нечисловой домен, используйте его ниже вместо mylocaldomain.com, см. политику stackoverflow) в Documents\IISExpress\config\applicationhost.config

    <bindings>
        <binding protocol="http" bindingInformation="*:53351:mylocaldomain.com" />
        <binding protocol="http" bindingInformation="*:53351:localhost" />
    </bindings>
    
  3. добавить автозапуск для службы запуска ISS Express автоматически

    <site name="NeuronCharts" id="2" serverAutoStart="true">
    
  4. Добавьте некоторые странные правила на http-сервер (я до сих пор не знаю, если это необходимо)

    netsh http add urlacl url=http://mylocaldomain.com:53351/ user=everyone
    
  5. запускать IISExpress вручную не из VS IDE

  6. вы увидите, что ISSExpress регистрирует привязки
  7. запустить браузер, http://mylocaldomain.com:53351 если он работает, тогда мы можем добавить правило брандмауэра
  8. добавить правило брандмауэра

    netsh advfirewall firewall add rule name="IISExpressWeb" dir=in protocol=tcp localport=53351 remoteip=any action=allow
    

установите значение remoteip на любое, если вы хотите получить доступ к вашему серверу из внешнего мира, если вы хотите получить доступ к локальной сети, используйте localsubnet

  1. запустить брандмауэр

    netsh advfirewall set allprofiles state on
    
  2. проверьте еще раз все ли работает на локальном и публичном ip

Желаю тебе удачи

Рафал

Рафал
источник
3
Это привело к тому, что IIS Express больше не работал на Win8 с VS2013 без запуска VS2013 в качестве администратора. Это вызвано тем, что IIS Express пытается открыть внешний трафик в результате выполнения команды netsh. Я также никогда не был в состоянии заставить его обслуживать этот трафик; Я бы получил 503. Чтобы устранить проблему, вызванную командой netsh в этом ответе, запустите ее из командной строки, работающей от имени администратора: netsh http delete urlacl url=http://*:55416/(замените порт на ваш порт)
Крис Москини
fwiw - мне не нужен шаг 4 (необходим вызов netsh, в котором @Rafal не уверен), и, хотя мне не нужна привязка "localhost" на шаге 2 для запуска проектов VS2013 в моем решении, передний Конечные загрузки значительно быстрее, когда привязка "localhost" остается на месте.
Lukkea
Я обнаружил, что следование приведенным выше инструкциям все еще привело к 503 использованию localhost. Я обнаружил , что гость (Windows) имя машины должно было быть в привязках в applicationhost.config, и на хосте (Mac) имя гостя машины необходимо , чтобы быть сопоставлено 127.0.0.1в /etc/hosts. Только после этого запрос гостевой машины на хосте был успешным.
Мэтт
Одно дополнение к шагу 5. Используйте iisexpress.exe / siteid: id, где id - это значение атрибута id вашего сайта в настройке <site id = "id">, иначе он запустит 1-й сайт.
Mudit Jain
9

Обнаружил, что проблема была связана с плохим отображением urlacl. Чтобы понять это:

netsh http show urlacl 

и искать такие вещи, как http://+:80/или порт, к которому вы привязываете.

Тогда используйте

netsh http delete url=<the url from the list>

Это решило проблему для меня.

Энтони Риццоло
источник
4
должен быть netsh http delete urlacl url = <URL из списка>, это сработало для меня, спасибо!
sergiogx
1
Это обсуждается более подробно в блоге msdn . В конечном итоге это была и моя проблема.
Кевин Шарнхорст
3
Спасибо, точный синтаксисnetsh http delete urlacl <yoururl>
Йоэль HALB
7

У меня ничего не получалось. Наконец я нашел iisexpress-прокси

Смотрите мой ответ https://stackoverflow.com/a/33623399/631527

Другое решение ngrok

Инструментарий
источник
Удивительный! Я пробовал все эти другие решения, и они тоже не работали. «Плохой запрос» или «Сервис недоступен». Слишком сложно. Я установил модуль узла и запустил его, он мгновенно работает !!
TetraDev
РАБОТАЕТ! свят! Спасибо!
Айсон Бакстер
Проверьте ngrok также
Инструментарий
1
Это просто работает как шарм с Ngrok! Странно, что сначала нужно перенаправить с локального хоста на iis-прокси, а затем с прокси на ngrok, но эй, сработало !. Например, у меня есть iisexpress на порт 3028. Я побежал, iisexpress-proxy 3028 to 12345а затем ./ngrok.exe http 12345. Re
Рюэль Рибейро
@TetraDev, «Плохой запрос» или «Служба недоступна» была из-за того, что заголовок узла, полученный при доступе к localhost от ngrok, не был локальным, как объяснено здесь
Дани Торрес
3

Что мне помогло, так это щелкнув правой кнопкой мыши значок «IISExpress», «Показать все приложения». Затем выбрав веб-сайт, я увидел, какой aplicationhost.config он использует, и исправление прошло отлично.

Конфигурация IISExpress

Эммануэль
источник
1

Проблема заключается в обновлении файла applicationhost.config внутри веб-папки вместо решения. Файл конфигурации решения, который нужно изменить

Виктор Арсе
источник
1

После решения @vikomall не забудьте запустить VS от имени администратора. Это исправить это для меня.

Rapido
источник
0

Что касается ответа Энтони Риццоло: в Windows 8.1 мне приходилось печатать так:

netsh http delete urlacl url=<the url from the list>

Например:

netsh http delete urlacl url=http://+:8689/
Elrinth
источник
0

Ни один из ответов выше не работал для меня.

У меня было две записи в netsh для одного и того же сервиса

netsh http show urlacl

введите описание изображения здесь

Один использует сильный подстановочный знак, другой использует слабый подстановочный знак.

Удаление одного со слабым подстановочным знаком сделало свою работу.

Подробнее о сильных и слабых подстановочных знаках в контексте netsh

Когда элемент хоста UrlPrefix состоит из одного знака плюс (+), UrlPrefix сопоставляет все возможные имена хостов в контексте своей схемы, порта и относительных элементов UR и попадает в категорию подстановочных знаков.

Когда звездочка (*) появляется в качестве основного элемента, тогда UrlPrefix попадает в категорию слабых подстановочных знаков. Этот тип UrlPrefix соответствует любому имени хоста, связанному с указанной схемой, портом и относительным URI, которому еще не сопоставлено UrlPrefix со строгим подстановочным знаком, явным или привязанным к IP-адресу слабым подстановочным знаком. Эта спецификация хоста может использоваться в качестве универсальной по умолчанию в некоторых случаях или может использоваться для указания большого раздела пространства имен URL без необходимости использования множества UrlPrefixes.

https://docs.microsoft.com/en-gb/windows/desktop/Http/urlprefix-strings

matcheek
источник