有没有办法在 IIS express 中创建虚拟目录?我知道 Cassini 无法做到这一点,如果能够在不使用完整版 IIS 的情况下做到这一点,那就太好了。
到目前为止,我已经可以在 IIS express 中本地浏览到我的应用程序,如下所示:
我想做的是创建一个名为“OffSiteStuff”的虚拟目录并将其指向我的 C 驱动器上的某个位置,例如“c:\offsitestuff”,然后像这样浏览到该文件夹中的项目:
http://localhost:1132/OffSiteStuff/UserUploadedImage.jpg
我知道我可以使用我网站中的一个文件夹来执行此操作,并且仍然使用 IIS Express,或者,就此而言,普通的旧 Cassini,但该文件夹将存储用户上传的图像,我真的不想将这些图像与申请文件。
另一种“变大”的解决方案是,每次我想调试使用异地内容的功能时,都将站点部署到一个成熟的 Server 2008 IIS 7.5 实例上,但这也有点麻烦。
有什么方法可以在 <System.WebServer />
Web 配置元素中做到这一点?
applicationHost.config
文件位于项目根目录下:${PROJECT}\.vs\config\applicationHost.config
。
IIS express 配置由 applicationhost.config 管理。你可以在
用户\<用户名>\Documents\IISExpress\config 文件夹。
在里面,您可以找到包含每个 IIS Express 配置站点的部分的站点部分。
添加(或修改)这样的站点部分:
<site name="WebSiteWithVirtualDirectory" id="20">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\temp\website1" />
</application>
<application path="/OffSiteStuff" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="d:\temp\SubFolderApp" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:1132:localhost" />
</bindings>
</site>
实际上,您需要在站点中为每个虚拟目录添加一个新的应用程序标记。您可以获得很大的灵活性,因为您可以为虚拟目录设置不同的配置(例如不同的 .Net Framework 版本)
编辑感谢 Fevzi Apaydın 指出一个更优雅的解决方案。
您可以通过在 Application 标签中添加一个或多个 virtualDirectory 标签来获得相同的结果:
<site name="WebSiteWithVirtualDirectory" id="20">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\temp\website1" />
<virtualDirectory path="/OffSiteStuff" physicalPath="d:\temp\SubFolderApp" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:1132:localhost" />
</bindings>
</site>
参考:
站点的应用程序标记
虚拟目录标签
@Be.St. 的方法是正确的,但不完整。我只是复制他的解释并纠正不正确的部分。
IIS express 配置由 applicationhost.config 管理。你可以在
用户\<用户名>\Documents\IISExpress\config 文件夹。
在里面,您可以找到包含每个 IIS Express 配置站点的部分的站点部分。
添加(或修改)这样的站点部分:
<site name="WebSiteWithVirtualDirectory" id="20">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\temp\website1" />
<virtualDirectory path="/OffSiteStuff" physicalPath="d:\temp\SubFolderApp" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:1132:localhost" />
</bindings>
</site>
而不是添加新的应用程序块,您应该只向应用程序父元素添加一个新的 virtualDirectory 元素。
编辑 - Visual Studio 2015
如果您正在寻找 applicationHost.config 文件并且您使用的是 VS2015,您将在以下位置找到它:
[solution_directory]/.vs/config/applicationHost.config
在 VS2013 中,我按以下步骤执行此操作:
1.右键单击Web应用程序项目并点击属性
2.查看“属性”页面的“Web”选项卡
3.在服务器下,“IIS Express”是下拉菜单的默认选项,在“项目网址”中,将使用端口号的 url 更改为适合您的端口号。例如,我删除了端口号并在 localhost 之后添加了“/MVCDemo4”。
4.单击“创建虚拟目录”按钮。
5.运行您的项目,将使用新的 url
如果您使用的是 Visual Studio 2013(可能需要专业版或更高版本),我可以通过右键单击解决方案资源管理器中的网站并单击添加 > 将虚拟目录添加到 IIS Express(基于文件的)网站新的虚拟目录。与此处描述的手动方法一样,这向 applicationhost.config 文件添加了一个条目。
一个新选项是 Jexus Manager for IIS Express,
https://blog.lextudio.com/2014/10/jexus-manager-for-iis-express/
它只是您知道如何使用的管理工具。
我必须在 [project].vs\config\applicationhost.config 文件中输入。
在此之前,它通过部署而不是代码工作。
在回答进一步的问题 -
“无论如何要在 Visual Studio 项目中应用它吗?在多开发人员环境中,如果其他人检查了他们机器上的代码,那么他们的本地 IIS Express 将不会配置虚拟目录并导致运行时错误不是吗?”
我从来没有在任何地方找到一致的答案,但后来发现你可以使用网站项目文件中的 XmlPoke 任务通过构建后事件来做到这一点 -
<Target Name="AfterBuild">
<!-- Get the local directory root (and strip off the website name) -->
<PropertyGroup>
<LocalTarget>$(ProjectDir.Replace('MyWebSite\', ''))</LocalTarget>
</PropertyGroup>
<!-- Now change the virtual directories as you need to -->
<XmlPoke XmlInputPath="..\..\Source\Assemblies\MyWebSite\.vs\MyWebSite\config\applicationhost.config"
Value="$(LocalTarget)AnotherVirtual"
Query="/configuration/system.applicationHost/sites/site[@name='MyWebSite']/application[@path='/']/virtualDirectory[@path='/AnotherVirtual']/@physicalPath"/>
</Target>
您可以使用此技术在 IISExpress 启动之前重新指向文件中的任何内容。这将允许您最初强制将 applicationHost.config 文件放入 GIT(假设它被 gitignore 忽略),然后在构建时重新指向所有路径。 GIT 将忽略对文件的任何更改,因此现在可以轻松共享它们。
回答有关在一个站点下添加其他应用程序的进一步问题:
您可以在应用程序主机文件中创建站点,就像在您的服务器上创建站点一样。例如:
<site name="MyWebSite" id="2">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\GIT\MyWebSite\Main" />
<virtualDirectory path="/SharedContent" physicalPath="C:\GIT\SharedContent" />
<virtualDirectory path="/ServerResources" physicalPath="C:\GIT\ServerResources" />
</application>
<application path="/AppSubSite" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\GIT\AppSubSite\" />
<virtualDirectory path="/SharedContent" physicalPath="C:\GIT\SharedContent" />
<virtualDirectory path="/ServerResources" physicalPath="C:\GIT\ServerResources" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:4076:localhost" />
</bindings>
</site>
然后使用上述技术在构建时更改文件夹位置。
Visual Studio Studio 专业版 2017
转到 /Solution/.vs 目录
打开 applicationHost.config 文件展开
添加
我还有别的东西,在 SBS 环境中无法访问的文件本身。
删除 config 文件夹中的文件(如果您无法打开它们!)并将它们替换为您自己本地 PC 上的文件夹副本。
为我修好了:)
applicationhost.config
的位置已更改。比以前的版本更明智的是,它现在位于解决方案文件夹的.vs\config
子文件夹中。