IISExpress 从远程机器返回 503 错误

Posted

技术标签:

【中文标题】IISExpress 从远程机器返回 503 错误【英文标题】:IISExpress returns a 503 error from remote machines 【发布时间】:2011-07-23 11:43:38 【问题描述】:

我正在尝试使用本地网络上的一些其他机器/设备测试我在本地 IISExpress 实例中运行的网站。我正在运行 Win7 Pro。

当我第一次尝试从本地网段上的另一台机器浏览到我的机器时,我收到 400 错误:主机名无效。

我了解我需要使用提升的命令提示符上的命令授予对 ACL 的远程访问权限,例如:

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

现在我收到 503 服务不可用错误。

Windows 防火墙当前已关闭,我可以使用地址 http://localhost:50333 浏览我的本地 IISExpress 实例

这个配置难题的最后一部分是什么?

【问题讨论】:

如果您从您的计算机浏览到http://mymachinename:50333/ 会发生什么? 问题已解决。查看 vikomall 接受的答案 在这里更深入地讨论这个问题:hanselman.com/blog/… 您可以安装我们的免费 VS 扩展“Conveyor”来解决这个问题marketplace.visualstudio.com/… 【参考方案1】:

您似乎在 applicationhost.config 文件中缺少绑定信息条目。

    打开您的 applicationhost.config 文件。可能的位置是:

    %userprofile%\Documents\IISExpress\config\applicationhost.config $(solutionDir)\.vs\config\applicationhost.config (VS2015) 如果做不到这一点,请检查 iisexpress.exe 的输出以确定。

    找到您的网站条目并添加以下与您的机器名称绑定。

         <binding protocol="http" bindingInformation=":50333:your-machine-name" />
    

    重启 IIS Express

【讨论】:

没关系。 Visual Studio 为该项目创建了一个重复的配置条目。我删除了它,它起作用了。 IIS Express 并不总是使用该路径的配置文件。仔细阅读iisexpress.exe 的输出,看看它使用的是哪个配置文件。 关键点3,重启IIS Express!在系统托盘中找到图标并停止它以强制重新启动。不确定是否有更优雅的方式。但这对我有用。谢谢! 如果您懒得添加每个主机名/IP 地址组合,请使用 * 而不是“your-machine-name” 另一个提示:如果您右键单击 IISExpress 的系统托盘图标,您可以选择“显示所有应用程序”,这将打开一个对话框,显示您当前在本地运行的所有应用程序。右键单击所需的应用程序(不要左键单击,否则会打开浏览器),然后您将在下面看到“路径”和“配置”。左键单击“配置”,它将打开相关的 Applicationhost.config 文件,您需要在其中添加/编辑如上所述的绑定。这是定位当前配置的简单方法。【参考方案2】:

只有一件事对我有用。

使用*: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 和主机名部分,所以我最终得到:&lt;binding protocol="https" bindingInformation="*:44300:*" /&gt; &lt;binding protocol="http" bindingInformation="*:8888:*" /&gt; 编辑:真的很想理解 SO markdown,我退出了 :)。【参考方案3】:

在如此完整的主题上浪费了 3 多小时后,我决定与您分享我的设置。 我的配置是 Visual Express 2012 for Web update 4 on windows 8。这是我自从学习(至少 8 年)以来第一次回到 MS VS,现在我确定 linux 规则。在 django 上,这种设置花了我 10 分钟搜索文档。

    关闭防火墙进行测试

    netsh advfirewall set allprofiles state off
    

    在我的情况下设置绑定本地地址是 localIP=192.168.1.102(因为链接不能包含非数字域,请在下面使用它而不是 mylocaldomain.com,请参阅 *** 政策) 在Documents\IISExpress\config\applicationhost.config

    <bindings>
        <binding protocol="http" bindingInformation="*:53351:mylocaldomain.com" />
        <binding protocol="http" bindingInformation="*:53351:localhost" />
    </bindings>
    

    为ISS Express自动启动服务添加自动运行

    <site name="NeuronCharts" id="2" serverAutoStart="true">
    

    给http服务器添加一些奇怪的规则(我还是不知道这是否有必要)

    netsh http add urlacl url=http://mylocaldomain.com:53351/ user=everyone
    

    不从 VS IDE 手动运行 IISExpress

    您会看到 ISSExpress 正在注册绑定 运行浏览器http://mylocaldomain.com:53351 如果它正常工作,那么我们可以添加防火墙规则

    添加防火墙规则

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

如果你想从外部世界访问你的服务器,如果你想访问本地网络使用 localsubnet,请将 remoteip 设置为 any

    启动防火墙

    netsh advfirewall set allprofiles state on
    

    再次检查本地和公共 ip 上是否一切正常

祝你好运

拉法尔

【讨论】:

这导致 IIS Express 在没有以管理员身份运行 VS2013 的情况下不再在带有 VS2013 的 Win8 上运行。这是由于 IIS Express 现在尝试通过 netsh 命令打开外部流量造成的。我也从来没有能够真正让它为这种流量服务。我会得到 503。要解决此答案中由 netsh 命令引起的问题,请从以管理员身份运行的命令提示符运行此命令:netsh http delete urlacl url=http://*:55416/(将端口替换为您的端口) fwiw - 我不需要第 4 步(@Rafal 不确定的 netsh 调用是否必要),虽然我不需要第 2 步中的“localhost”绑定来运行VS2013 项目在我的解决方案中,当保留“localhost”绑定时,前端加载速度显着 我发现按照上述说明使用localhost仍然会导致503。我发现来宾(Windows)机器名需要在applicationhost.config的绑定中,而在主机(Mac)上,来宾机器名需要映射到/etc/hosts中的127.0.0.1。只有这样,对主机上的来宾机器的请求才会成功。 第 5 步的补充。使用 iisexpress.exe /siteid:id 其中 id 是 设置中您的站点 id 属性的值,否则它将启动第一个站点.【参考方案4】:

发现问题与错误的 urlacl 映射有关。要弄清楚这一点:

netsh http show urlacl 

并查找诸如http://+:80/ 或您要绑定的端口之类的内容。

然后使用

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

这解决了我的问题。

【讨论】:

应该是 netsh http delete urlacl url= ,这对我有用,谢谢! 这在msdn blog 上有更详细的讨论。这最终也是我的问题。 谢谢,确切的语法是netsh http delete urlacl &lt;yoururl&gt;【参考方案5】:

没有什么对我有用。终于找到iisexpress-proxy

看我的回答https://***.com/a/33623399/631527

另一种解决方案是ngrok

【讨论】:

太棒了!我尝试了所有其他解决方案,但它们也不起作用。 “错误请求”或“服务不可用”。太复杂。我安装了节点模块并运行它,它立即工作! 工作!圣!谢谢! 查看 ngrok 也 它与 ngrok 一起使用就像一个魅力!不得不先从 localhost 路由到 iis-proxy,然后从代理路由到 ngrok,这很奇怪,但是,嘿,成功了!例如,我的 iisexpress 位于端口 3028。我跑了iisexpress-proxy 3028 to 12345 然后./ngrok.exe http 12345。 ? @TetraDev,“错误请求”或“服务不可用”是因为从 ngrok 访问 localhost 时收到的主机标头不是 localhost 的,如 here 所述【参考方案6】:

对我有帮助的是右键单击“IISExpress”图标“显示所有应用程序”。然后选择网站,我看到它使用了哪个 aplicationhost.config,并且更正完美。

【讨论】:

【参考方案7】:

问题是更新 web 文件夹中的 applicationhost.config 文件,而不是解决方案的。解决方案配置文件是要更改的文件

【讨论】:

【参考方案8】:

关于 Anthony Rizzolo 的回答:在 Windows 8.1 中,我必须这样输入:

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

例如:

netsh http delete urlacl url=http://+:8689/

【讨论】:

【参考方案9】:

@vikomall 解决后不要忘记以管理员身份启动 VS。 这帮我解决了。

【讨论】:

【参考方案10】:

以上答案都不适合我。

我在 netsh 中有两个相同服务的条目

netsh http show urlacl

一个使用强通配符,另一个使用弱通配符。

删除带有弱通配符的那个就可以了。

更多关于 netsh 上下文中的强弱通配符

当 UrlPrefix 的宿主元素由单个加号组成时 (+),UrlPrefix 匹配上下文中所有可能的主机名 它的 scheme、port 和 relativeURI 元素,属于强项 通配符类别。

当星号 (*) 作为宿主元素出现时,UrlPrefix 属于弱通配符类别。这种 UrlPrefix 匹配 与指定方案、端口和 尚未被强通配符匹配的 relativeURI, 显式或 IP 绑定的弱通配符 UrlPrefix。本主机规格 在某些情况下可以用作默认的包罗万象,或者可以 用于指定一大段 URL 命名空间而不必使用 许多 UrlPrefixes。

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

【讨论】:

以上是关于IISExpress 从远程机器返回 503 错误的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery 返回内部错误 503:23 列 X 600,00 行

HttpURLConnection 通过代理访问时返回 503 错误

谷歌机器人在索引我的网站时出现 503 错误

Heroku 上的 Scrapy 爬虫返回 503 服务不可用

当我在本地机器上运行或调试 MVC 应用程序时出现空白页

IIS 服务器上的 Web API 内的 Httpclient GetAsync 失败(503 服务不可用)