我建立一个使用了客户端的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"; }
}
}
有两个问题与此设置:
- 一种用于请求
/myapp/api
或/myapp/resources
失败,500错误,因为有多个匹配的控制器类型。 我知道,路由可以在控制器内给予优先考虑,我想我希望的是,路由优先级也将在不同的控制器保留。 但是,这是无可否认在黑暗中拍摄。 - 如果有需求
myapp/customers/
和myapp/orders/today
失败,一个404错误,那么显然我的路线BootstrapController.Index()
甚至没有正常工作。
唯一可行的请求/myapp
,它正确返回“引导”与200 OK。
我不知道有足够的了解的Web API如何运作才能够解决这个问题。 希望这里有人能帮助!