问题 通过Visual Studio在同一端口上运行多个IIS Express实例


我目前在IIS Express中为我正在处理的每个应用程序配置了站点。它们中的每一个都设置为在端口80和443上本地运行,但具有单独的绑定(HTTP:// SITE1 / 和 HTTP://站点2 /)使用从我的hosts文件中本地指向的别名。

我可以在直接启动IIS Express时(从命令行)启动这些站点,但是在调试失败时让VS2010启动它们。第一个站点将按预期启动和调试,但第二个站点将启动生成错误:“无法启动IIS Express Web服务器。端口'80'正在使用中。”

这是我正在使用的IIS Express配置(略微修改以删除项目名称):

<site name="Site1" id="1" serverAutoStart="true">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="Site1Path" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:80:Site1" />
        <binding protocol="https" bindingInformation="*:443:Site1" />
    </bindings>
</site>
<site name="Site2" id="2" serverAutoStart="true">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="Site2Path" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:80:Site2" />
        <binding protocol="https" bindingInformation="*:443:Site2" />
    </bindings>
</site>

似乎VS正在检查当前正在端口80上侦听的任何内容,而IIS Express不受此限制。我仍然可以将VS附加到由命令行启动的IIS Express实例,但我更愿意让VS管理它们。

这是VS2010如何处理IIS Express的限制,如果是这样,有什么好的解决方法?


1937
2018-05-09 13:36


起源



答案:


你是对的......这是VS2010的限制。我不确定以下解决方法是否适合您。

您可以拥有包含多个应用程序的单个站点,如下所示。

<site name="MySite" id="1" serverAutoStart="true">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="SiteRoot" />
    </application>
    <application path="/Site1" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="Site1Path" />
    </application>
    <application path="/Site2" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="Site2Path" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:80:Site1" />
        <binding protocol="https" bindingInformation="*:443:Site1" />
    </bindings>
</site>

然后你可以访问它们 http://localhost/site1 和 http://localhost/site2


8
2018-05-09 17:05



虽然对我来说似乎没有真正的解决方案,但我会继续将其标记为可能有用的答案。虚拟目录对我来说不起作用,但幸运的是我还不需要同时运行这两个应用程序,所以让VS启动它们现在仍在工作。 - Ryan Versaw
@vikomall,如何使用C#代码配置这些多个应用程序?我想使用C#代码为单个IIS Express实例配置多个应用程序。 - Kathir Subramaniam


答案:


你是对的......这是VS2010的限制。我不确定以下解决方法是否适合您。

您可以拥有包含多个应用程序的单个站点,如下所示。

<site name="MySite" id="1" serverAutoStart="true">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="SiteRoot" />
    </application>
    <application path="/Site1" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="Site1Path" />
    </application>
    <application path="/Site2" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="Site2Path" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:80:Site1" />
        <binding protocol="https" bindingInformation="*:443:Site1" />
    </bindings>
</site>

然后你可以访问它们 http://localhost/site1 和 http://localhost/site2


8
2018-05-09 17:05



虽然对我来说似乎没有真正的解决方案,但我会继续将其标记为可能有用的答案。虚拟目录对我来说不起作用,但幸运的是我还不需要同时运行这两个应用程序,所以让VS启动它们现在仍在工作。 - Ryan Versaw
@vikomall,如何使用C#代码配置这些多个应用程序?我想使用C#代码为单个IIS Express实例配置多个应用程序。 - Kathir Subramaniam


在同一端口视觉工作室的情况下,每个站点的绑定集合的开始似乎是错误的。 从visual studio运行可以通过添加指定不同端口的绑定来完成。

<site name="Site1" id="1" serverAutoStart="true">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="Site1Path" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:44300:Site1" />
        <binding protocol="http" bindingInformation="*:80:Site1" />
    </bindings>
</site>
<site name="Site2" id="2" serverAutoStart="true">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="Site2Path" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:44301:Site2" />
        <binding protocol="http" bindingInformation="*:80:Site2" />
    </bindings>
</site>

<binding protocol="http" bindingInformation="*:44300:Site1" />

<binding protocol="http" bindingInformation="*:44301:Site2" />

运行http://Site1/  http://Site2/ 和 http://Site1:44300/  http://Site2:44301

netsh http add urlacl url=http://Site1:44300/


2
2018-06-07 13:14



欢迎来到SO。顺便说一下btw!但是你能用英语翻译日语部分吗?所以想把英语作为他们唯一的语言。 ;) 谢谢。 - ForceMagic