How do I change the root path of a ASP.Net WebAPI application?

asp.net, asp.net-web-api

Solution

URL rewriting is exactly what you want, with a condition block to test if the file exists. The content under your `dist` directory is static (i.e. lives on the file system) but the `WebApiApp` routes are dynamic. So you simply need to test if the route matches a file that exists in the `dist` directory or not, if not simply let .NET handle the route. Adding the following to your `Web.config` file within the `<system.webServer>` section should do the trick:

<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>

The second rule is optional but it means a request for the root of your site will still serve the `index.html` file from the `dist` directory, effectively making the root of the project `WebApiApp\dist` but still allowing all WebAPI routing.

Problem

I am trying create a single page web app combining both ASP.NET WebAPI and the Yeoman Angluarjs generator. Currently I have a project structure as laid out below `|-- yeomanAngularApp |-- app |-- dist |-- scripts |-- index.html |-- etc... |-- WebApiApp |-- App_Start |-- bin |-- Content |-- Controllers |-- Models |-- WebApiApp.csproj |-- dist |-- scripts |-- index.html ` When I want to build the app distribution, I copy the `dist` folder in the `yeomanAngularApp` into the `WebApiApp` replacing the `dist` folder in there. Now this is all very easy to do. What I really then want to do is to tell the `WebApiApp` not to use `WebApiApp\` as the root of the project, but use `WebApiApp\dist`. This means instead of going to `http://localhost/dist/index.html`, I could go to `http://localhost/index.html` even though `index.html` is in the `dist` folder. On top of this I would also like my WebAPI routing for the controllers to play nicely too. I've been searching for a while and I can't seem to find an answer. The best I can come up with, is using URL rewriting, which to me doesn't feel right.

Original source