如何将除Web API之外的其他一切路由到/index.html

我一直在使用Web API处理ASP.NET MVC中的AngularJS项目。 除非您尝试直接转到有angular度的路由URL或刷新页面,否则它的效果很好。 而不是用服务器configuration瞎搞,我认为这将是我可以处理与MVC的路由引擎

目前的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 = @"^[az]+$" } ); config.Routes.MapHttpRoute( name: "ApiWithAction", routeTemplate: "api/{controller}/{action}", defaults: new { action = "Get" } ); } } 

当前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/*"); } } 

当前的Global.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, }; } } 

目标:

/ api / *继续转到WebAPI,/ partials / 和/ assets / all转到文件系统,绝对是其他任何东西都被路由到/index.html,这是我的Angular单页面应用程序。

– 编辑 –

我似乎已经得到它的工作。 将此添加到RouteConfig.cs的底部

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

而这个根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> 

然而,它闻起来像一个黑客。 任何更好的方法来做到这一点?

使用通配符段:

 routes.MapRoute( name: "Default", url: "{*anything}", defaults: new { controller = "Home", action = "Index" } ); 

build议更多的本地方法

 <system.webServer> <httpErrors errorMode="Custom"> <remove statusCode="404" subStatusCode="-1"/> <error statusCode="404" prefixLanguageFilePath="" path="/index.cshtml" responseMode="ExecuteURL"/> </httpErrors> </system.webServer> 

在我的情况下,这些方法都没有奏效。 我被困在2错误消息地狱。 这种types的页面不提供或某种404。

url重写工作:

 <system.webServer> <rewrite> <rules> <rule name="AngularJS" stopProcessing="true"> <match url="[a-zA-Z]*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" /> </conditions> <action type="Rewrite" url="/" /> </rule> </rules> </rewrite> ... 

注意我匹配[a-zA-Z],因为我不想重写任何.js .map等url。

这工作在VS出Hte框,但在IIS中,您可能需要安装一个URL重写模块https://www.iis.net/downloads/microsoft/url-rewrite

我有一个类似的方法作为前几个答案,但不利的一面是,如果有人正在进行错误的API调用,他们最终会得到该索引页面,而不是更有用的东西。

所以我更新了我的内容,以便它将返回我的索引页面,以查找不以/ api开头的请求:

  //Web Api GlobalConfiguration.Configure(config => { config.MapHttpAttributeRoutes(); }); //MVC RouteTable.Routes.Ignore("api/{*anything}"); RouteTable.Routes.MapPageRoute("AnythingNonApi", "{*url}", "~/wwwroot/index.html"); 

那么,我刚刚删除了RouteConfig.RegisterRoutes(RouteTable.Routes); 调用Global.asax.cs ,现在input任何URL,如果资源存在,它将被服务。 即使API帮助页面仍然有效。