Comment acheminer TOUT autre que des Web API /index.html

J'ai travaillé sur un AngularJS projet, à l'intérieur de ASP.NET MVC à l'aide de l'API Web. Il fonctionne très bien sauf lorsque vous essayez d'accéder directement à un angulaires acheminé URL ou actualiser la page. Plutôt que de monkeying avec la configuration du serveur, j'ai pensé que ce serait quelque chose que je pouvais faire avec MVC du moteur de routage.

Actuel WebAPIConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"^[0-9]+$" }
        );

        config.Routes.MapHttpRoute(
            name: "ApiWithActionAndName",
            routeTemplate: "api/{controller}/{action}/{name}",
            defaults: null,
            constraints: new { name = @"^[a-z]+$" }
        );

        config.Routes.MapHttpRoute(
            name: "ApiWithAction",
            routeTemplate: "api/{controller}/{action}",
            defaults: new { action = "Get" }
        );
    }
}

Actuel RouteConfig:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute(""); //Allow index.html to load
        routes.IgnoreRoute("partials/*"); 
        routes.IgnoreRoute("assets/*");
    }
}

Mondiale Actuelle.asax.cs:

public class WebApiApplication : HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        var formatters = GlobalConfiguration.Configuration.Formatters;
        formatters.Remove(formatters.XmlFormatter);
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings
        {
            Formatting = Formatting.Indented,
            PreserveReferencesHandling = PreserveReferencesHandling.None,
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        };
    }
}

OBJECTIF:

/api/* continue d'aller en WebAPI, /partiels/, et /assets/ ira tous au système de fichiers, absolument rien d'autre est routée vers /index.html qui est mon Angulaire single page app.

--EDIT--

Me semble que j'ai eu à travailler. Ajoutée à la BAS DE RouteConfig.cs:

 routes.MapPageRoute("Default", "{*anything}", "~/index.html");

Et ce changement à la racine web.config:

<system.web>
...
  <compilation debug="true" targetFramework="4.5.1">
    <buildProviders>
      ...
      <add extension=".html" type="System.Web.Compilation.PageBuildProvider" /> <!-- Allows for routing everything to ~/index.html -->
      ...
    </buildProviders>
  </compilation>
...
</system.web>

Toutefois, il sent comme un hack. Une meilleure façon de faire cela?

  • Comme une note pour ceux qui tentent (et pour lesquels les réponses ci-dessous ne sont pas l'idéal), le hack répertoriés dans cette question fonctionne, MAIS pas si le chemin d'accès de l'utilisateur saisit aussi un dossier. Ainsi, par exemple, si vous voie tout à ~/index.html, puis le chemin d'accès /whatever/ ne voie là SI vous n'avez pas de chemin d'accès au dossier au sein de votre application appelée /whatever/.
  • Toutes les idées sur la façon de résoudre cette mise en garde?