传统上,我在本地主机开发服务器上使用自定义域。大致如下:

dev.example.com
dev.api.example.com

这为我在使用外部api(如Facebook)时提供了很大的灵活性。这在过去与内置的Visual Studio Development Server一起工作得很好,因为我所需要做的只是向指向127.0.0.1的DNS记录添加一个CNAME。

但是,我还不能让它与IIS Express一起工作。我所做的一切努力似乎都失败了。我甚至向applicationHost添加了正确的XML配置。IIS Express的配置文件,但它似乎不能像真正安装IIS那样识别有效的条目。

<binding protocol="http" bindingInformation="*:1288:dev.example.com" />

每当我输入这一行并尝试请求http://dev.example.com:1288时,我都会收到以下消息:

错误请求-无效的主机名

有人知道我是否遗漏了什么明显的东西吗?或者IIS Express团队真的缺乏预见到这种类型的使用?


当前回答

我试了以上所有的方法,都没用。解决这个问题的方法是在hosts文件中添加IPv6绑定。在@David murdoch回答的第五步中,添加两行而不是一行,即:

127.0.0.1 dev.example.com
::1 dev.example.com

我通过从命令行检查$ ping localhost来计算出来,它通常返回:

来自127.0.0.1的回复:bytes=32 time<1ms TTL=128

相反,它现在返回:

回复from::1:时间<1ms

我不知道为什么,但是由于某种原因,IIS Express开始使用IPv6而不是IPv4。

其他回答

这是为我工作(更新的VS 2013,见2010年的修订历史,VS 2015见这个:https://stackoverflow.com/a/32744234/218971):

Right-click your Web Application Project ▶ Properties ▶ Web, then configure the Servers section as follows: Select IIS Express ▼ from the drop down Project Url: http://localhost Override application root URL: http://dev.example.com Click Create Virtual Directory (if you get an error here you may need to disable IIS 5/6/7/8, change IIS's Default Site to anything but port :80, make sure Skype isn't using port 80, etc.) Optionally: Set the Start URL to http://dev.example.com Open %USERPROFILE%\My Documents\IISExpress\config\applicationhost.config (Windows XP, Vista, and 7) and edit the site definition in the <sites> config block to be along the lines of the following: <site name="DevExample" id="997005936"> <application path="/" applicationPool="Clr2IntegratedAppPool"> <virtualDirectory path="/" physicalPath="C:\path\to\application\root" /> </application> <bindings> <binding protocol="http" bindingInformation=":80:dev.example.com" /> </bindings> <applicationDefaults applicationPool="Clr2IntegratedAppPool" /> </site> If running MVC: make sure the applicationPool is set to one of the "Integrated" options (like "Clr2IntegratedAppPool"). Open your hosts file and add the line 127.0.0.1 dev.example.com. ► Start your application!

评论中有一些很棒的建议:

您可能需要以管理员身份运行Visual Studio。 如果你想让其他开发人员看到你的IIS,运行netsh http add urlacl url=http://dev.example.com:80/ user=everyone 如果您希望站点为所有主机解析,请设置bindingInformation="*:80:"。 使用任何端口,80只是方便。要解析所有主机,您需要以管理员身份运行Visual Studio

像上面的Jessa Flint一样,我不想手动编辑.vs\config\applicationhost。config,因为我希望更改能够持久地保存在源代码控制中。我也不想有一个单独的批处理文件。我使用的是VS 2015。

项目属性→构建事件→预构建事件命令行:


::The following configures IIS Express to bind to any address at the specified port

::remove binding if it already exists
"%programfiles%\IIS Express\appcmd.exe" set site "MySolution.Web" /-bindings.[protocol='http',bindingInformation='*:1167:'] /apphostconfig:"$(SolutionDir).vs\config\applicationhost.config"

::add the binding
"%programfiles%\IIS Express\appcmd.exe" set site "MySolution.Web" /+bindings.[protocol='http',bindingInformation='*:1167:'] /apphostconfig:"$(SolutionDir).vs\config\applicationhost.config"

只需确保将端口号更改为所需的端口。

把这个留在这里,以防有人需要…

我需要在IIS Express中为Wordpress Multisite设置自定义域,但在我以管理员身份运行Webmatrix/Visual Studio之前,任何东西都不起作用。然后我就可以将子域绑定到同一个应用程序。

<bindings> 
    <binding protocol="http" bindingInformation="*:12345:localhost" />
    <binding protocol="http" bindingInformation="*:12345:whatever.localhost" />
</bindings>

然后转到http://whatever.localhost:12345/将运行。

我使用iisexpress-proxy(从npm)来实现这一点。

https://github.com/icflorescu/iisexpress-proxy

在使用Visual Studio 2012和IIS Express时,更改现有绑定不会永久工作。(它可能在你关闭VS之前有效,但在那之后,事情就变得非常混乱了。)

关键是保持现有的本地主机绑定并在其之后添加一个新绑定。

除非您以管理员身份运行,否则还需要运行netsh add urlacl(以标准用户身份授予自己运行非本地主机站点的权限)。

如果要允许任意主机名,整个过程如下:

创建您的web应用程序,并找出它正在使用的端口(参见项目属性,web选项卡,项目Url)。 在管理员提示符下,运行以下命令(将portnumber替换为您在#1中计算出的端口号): Netsh HTTP添加urlacl url="http://*:portnumber/" user=everyone Netsh HTTP添加urlacl url="http://localhost:portnumber/" user=everyone

您也可以使用您的用户名(DOMAIN\ user),而不是所有人,以获得更好的安全性。

Open applicationhost.config (usually under My Documents\IIS Express\config), and find the element with your port number. Add one more binding with the host name you want (in this case, *). For example: <site name="MvcApplication1" id="2"> <application path="/" applicationPool="Clr4IntegratedAppPool"> <virtualDirectory path="/" physicalPath="C:\sites\MvcApplication1" /> </application> <bindings> <binding protocol="http" bindingInformation="*:12853:localhost" /> <binding protocol="http" bindingInformation="*:12853:*" /> </bindings> </site>

注意,如果想打开所有主机名(*),需要两个netsh命令(一个用于*,一个用于localhost)。如果您只想打开一个特定的主机名,则不需要严格地使用第二个netsh命令(localhost);只有具有特定主机名的一个就足够了。