在ASP.NET的Web API第2回退控制器航线(Fallback controller rout

2019-10-20 09:02发布

我建立一个使用了客户端的URL路径字符串的离线Web应用程序。

有几个(属性基础)的路由映射到资源,API调用等专用控制器。例如:

/myapp/api/...
/myapp/resources/...

那么我想不符合这些模式之一的所有请求路由到我的自举的HTML页面,我通过一个专用控制器目前服务。 因此,举例来说,下面的要求需要在引导HTML页面来结束:

/myapp/customers/...
/myapp/orders/...
/myapp/
/myapp/<anything that doesn't start with another controller's route prefix>

我使用OWIN,所以理论上我或许可以用某种定制的“回退”的处理程序做到这一点。 然而,我的价值,我得到自由与Web API框架的功能。

我还要提到的是网络API是“/ MYAPP”的OWIN映射的子路径下已经注册,因此该路径的这第一部分将不会在Web API的路线可以看出。 另外,我想如果可能的话,使用基于属性的路由保持,以提高可读性。

我设想的解决方案是这样的:

using Microsoft.Owin;
using Owin;
using System;
using System.Web.Http;

[assembly: OwinStartup(typeof(MyApp.Startup))]

namespace MyApp
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Map("/myapp", myApp =>
            {
                var configuration = new HttpConfiguration();
                configuration.MapHttpAttributeRoutes();
                configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
                myApp.UseWebApi(configuration);
            });
        }
    }

    [RoutePrefix("api")]
    public class MyApiController : ApiController
    {
        [HttpGet, Route("")] // GET: myapp/api
        public string Api() { return "api"; }
    }

    [RoutePrefix("resources")]
    public class ResourcesController : ApiController
    {
        [HttpGet, Route("")] // GET: myapp/resources
        public string Resources() { return "resources"; }
    }

    [RoutePrefix("")]
    public class BootstrapController : ApiController
    {
        [HttpGet, Route("{subpath:regex(^.*$)?}", // GET: myapp/...
            Name = "BootstrapPage", Order = Int32.MaxValue)]
        public string Index(string subpath = "") { return "bootstrap"; }
    }
}

有两个问题与此设置:

  1. 一种用于请求/myapp/api/myapp/resources失败,500错误,因为有多个匹配的控制器类型。 我知道,路由可以在控制器内给予优先考虑,我想我希望的是,路由优先级也将在不同的控制器保留。 但是,这是无可否认在黑暗中拍摄。
  2. 如果有需求myapp/customers/myapp/orders/today失败,一个404错误,那么显然我的路线BootstrapController.Index()甚至没有正常工作。

唯一可行的请求/myapp ,它正确返回“引导”与200 OK。

我不知道有足够的了解的Web API如何运作才能够解决这个问题。 希望这里有人能帮助!

Answer 1:

经过一些调查研究,指导试验和错误,我想出了一个解决方案。 它不允许我使用基于属性的路由在BootstrapController,这不是一个大问题,因为它是一个特例。

这里有必要的修改:

app.Map("/myapp", myApp =>
{
    var configuration = new HttpConfiguration();
    configuration.MapHttpAttributeRoutes();
    configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

    configuration.Routes.MapHttpRoute(
        name: "BootstrapPage",
        routeTemplate: "{*subpath}",
        defaults: new { controller = "Bootstrap", action = "Index", subpath = RouteParameter.Optional });

    myApp.UseWebApi(configuration);
});

该BootstrapController还需要有无路由属性被改写:

public class BootstrapController : ApiController
{
    [HttpGet]
    public string Index() { return "bootstrap"; }
}

这是在事后总是显而易见的。 :P我不知道那是什么的“多匹配的路由”问题可以通过使用路由表结合基于属性的途径来规避。 然后,它只是一个搞清楚如何使路由表项匹配任何深度的子路径的问题。



文章来源: Fallback controller route in ASP.NET Web API v2