使用 IIS Express 托管网站(临时)

Posted

技术标签:

【中文标题】使用 IIS Express 托管网站(临时)【英文标题】:Using IIS Express to host a website (temporarily) 【发布时间】:2011-03-08 17:11:06 【问题描述】:

我有一个网站 (MVC3),用于开发,托管在 IIS Express 中。 (我遇到了 Cassini Devserver 的错误,不得不升级......) 现在,我想知道,是否可以让我本地网络上的其他机器(路由器后面)看到该站点托管在我的机器上? (例如,如果我将http://my.local.ip:port 写入与我在同一个局域网上的浏览器中,页面会加载吗?)

【问题讨论】:

@John Saunders:做到了。不工作。 愿意分享结果吗? “不工作”是什么意思? 这意味着页面没有加载(服务器没有响应),所以我猜 IIS Express 没有响应非本地主机请求(如 Cassini)。但由于 IIS Express 是一个完整的服务器,它应该能够做到。 【参考方案1】:

默认情况下,IIS Express 仅服务于 localhost 请求。要处理外部请求,请编辑applicationhost.config 文件(位于%userprofile%\documents\iisexpress\config\)并将localhost 更改为'*' 或您的机器名称。 (请记住,对于非本地主机绑定,您必须以管理员身份运行或将 URL acl 设置为管理员,然后以非管理员身份运行 iisexpress)

【讨论】:

我在配置 xml 中找到了我的网站,并将 <binding protocol="http" bindingInformation="*:44886:localhost" /> 更改为 <binding protocol="http" bindingInformation="*:44886:*" />。然后在管理员模式下添加 url acl (netsh http add urlacl url=http://+:44886/ user=\Everyone)。现在,当我在 Visual Studio 中按 F5 时,我得到“无法启动 IIS Express”。 运行此命令“netsh http add urlacl url=http://*:44886/ user=Everyone”并尝试再次启动它(按 F5)。这应该有效。以下链接也可以帮助learn.iis.net/page.aspx/1005/… 仅供参考,您必须重新启动服务才能使其生效,否则您会收到 503 错误。 svc 重启后对我来说非常适合。 @KevinWon 我应该重新启动的服务的名称是什么? @CiaranBruen:两个链接都指向同一个页面(现在,无论如何)。【参考方案2】:

或者,您可以使用AnalogX's PortMapper 之类的东西充当小型环回代理,以隧道将本地本地绑定端口私下绑定到公开开放的端口。

例如,

IISExpress 本地绑定到 localhost:8080 PortMapper 端口 9090 配置为将流量中继到 localhost:8080

实际上,端口 9090 上的任何连接(由 PortMapper 打开)都将通过隧道连接到 localhost:8080;从而绕过所有有时会很痛苦的 netsh 废话。

下面是我的配置:

使用这种代理方法的好处是它不会在本地开发盒上永久公开一个开放的 IISExpress 端口。

很少,有时我想公开开放端口进行会议;但大多数时候,端口应该关闭并且只能由 localhost 访问。每次修改路由器上的防火墙规则是一件很痛苦的事情。以下是我的设置方式:

我的路由器防火墙将 9090 端口转发到 PortMapper 只有在 PortMapper 正在运行时,PortMapper 才会继续将流量代理到 IISExpress(在 8080 上侦听)。

注意

确保关闭所有 PortMapper 窗口以使更改生效。

注2

正如其他人所描述的,您可能需要为您的应用程序调整 IISExpress 绑定

 My Documents\IISExpress\applicationhost.config
 project\.vs\config\applicationhost.config

类似于:

<bindings>
  <!-- bindingInformaiton format:
          IPToBindTo:Port:DNSHostName -->

  <!--OLD:
  <binding protocol="http" bindingInformation="*:8080:localhost"/>-->

  <!--Change '*' to 127.0.0.1 and remove 'localhost' right of the port number
      to avoid invalid DNS hostname errors -->
  <binding protocol="http" bindingInformation="127.0.0.1:8080:" />

</bindings>

【讨论】:

这个想法非常好(我肯定会将这个代理用于其他场景),但是在这种情况下它不起作用。 IIS Express 只是在尝试通过其 IP 访问该站点时返回给您:HTTP Error 400. The request hostname is invalid. 我更新了我的答案;希望这可以解决您的“主机名”无效错误。【参考方案3】:

我认为要成功,需要三个步骤:

1) 添加一个或多个 dns 条目,以便其他机器可以查找开发机器的 IP 地址

2) 像这样在 %userprofile/documents/IISExpress/Config 中添加到 applicationhost.config 的绑定

<site name="MobileDashboard(2)" id="7">
                <bindings>
                    ...
                    <binding protocol="http" bindingInformation="*:yourport#:yourmachinendnsname" />
                </bindings>
            </site>

3) 运行找到的命令here 以允许传入请求:

netsh http add urlacl url=http://yourmachinendnsname:yourport#/ user=everyone

【讨论】:

那么这是我需要添加到 C:\Windows\System32\drivers\etc\hosts: localhost ...例如:192.168.125.50 localhost 吗?【参考方案4】:

这个帖子的答案很好,它只是忽略了防火墙例外。

netsh advfirewall firewall add rule name="IIS Express (non-SSL)" action=allow protocol=TCP dir=in localport=8000

netsh advfirewall firewall add rule name="IIS Express (SSL)" action=allow protocol=TCP dir=in localport=44300

来源于cmets@http://blogs.iis.net/vaidyg/archive/2010/07/29/serving-external-traffic-with-webmatrix-beta.aspx

【讨论】:

【参考方案5】:

http://blogs.microsoft.co.il/blogs/shair/archive/2008/12/15/how-to-use-fiddler-on-localhost.aspx 的 Fiddler 中的自定义规则技巧最终对我有用。

【讨论】:

【参考方案6】:

是的,您可以使用 iis express 为本地局域网配置尽可能多的站点,这里是链接Accessing local sites from Lan IIS Express,它解释了如何实现这一点。

【讨论】:

我试过这个,它对我不起作用。如果我可以应用它,这将是最干净的答案。额外的应用程序(具有 LAN IP 地址的应用程序)没有出现在我站点下的 IIS Express 中,只有 localhost 一个。会不会少了一个步骤?我确实退出/重新启动了 IIS Express。我的applicationhost.config 看起来像&lt;binding protocol="http" bindingInformation="*:23297:localhost" /&gt; &lt;binding protocol="http" bindingInformation="*:23297:192.168.1.254" /&gt;

以上是关于使用 IIS Express 托管网站(临时)的主要内容,如果未能解决你的问题,请参考以下文章

IIS Express - 临时模拟经过身份验证的用户

IIS 托管的 WCF 服务创建了数千个临时文件夹

在 IIS Express 中托管 webapi,因此它只能由父 Web 应用程序访问

什么是 Kestrel(与 IIS / Express 相比)

使用 Node.js Express 托管多个网站

来自 IIS 中托管的网站的 SOAP API 访问错误