如何将除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帮助页面仍然有效。