我正在尝试创建一个结合ASP.NET WebAPI和Yeoman Angluarjs生成器的单页Web应用程序。目前我的项目结构如下所示
|-- yeomanAngularApp
|-- app
|-- dist
|-- scripts
|-- index.html
|-- etc...
|-- WebApiApp
|-- App_Start
|-- bin
|-- Content
|-- Controllers
|-- Models
|-- WebApiApp.csproj
|-- dist
|-- scripts
|-- index.html
当我想构建应用程序分发时,我将dist
中的yeomanAngularApp
文件夹复制到替换WebApiApp
文件夹中的dist
。
现在这很容易做到。我真正想做的是告诉WebApiApp
不要使用WebApiApp\
作为项目的根,而是使用WebApiApp\dist
。这意味着我可以转到http://localhost/dist/index.html
,而不是转到http://localhost/index.html
,即使index.html
位于dist
文件夹中。除此之外,我还希望控制器的WebAPI路由能够很好地发挥作用。
我一直在寻找一段时间,我似乎无法找到答案。我能想到的最好的就是使用URL重写,这对我来说感觉不对。
答案 0 :(得分:24)
URL重写正是您想要的,使用条件块来测试文件是否存在。 dist
目录下的内容是静态的(即存在于文件系统中),但WebApiApp
路由是动态的。所以你只需要测试路由是否匹配dist
目录中存在的文件,如果不是简单地让.NET处理路由。将以下内容添加到Web.config
部分中的<system.webServer>
文件中应该可以解决问题:
<rewrite>
<rules>
<rule name="static dist files" stopProcessing="true">
<match url="^(.+)$" />
<conditions>
<add input="{APPL_PHYSICAL_PATH}dist\{R:1}" matchType="IsFile" />
</conditions>
<action type="Rewrite" url="/dist/{R:1}" />
</rule>
<rule name="index.html as document root" stopProcessing="true">
<match url="^$" />
<action type="Rewrite" url="/dist/index.html" />
</rule>
</rules>
</rewrite>
第二条规则是可选的,但这意味着对您网站的根目录的请求仍会提供index.html
目录中的dist
文件,从而有效地创建项目的根目录WebApiApp\dist
但仍允许所有WebAPI路由。