是否可以自定义ASP.NET Web API的路由机制,以将所有请求路由到一个控制器方法?
如果有请求的话
www.mysite.com/api/products/
要么
www.mysite.com/api/otherResource/7
所有这些都将被路由到我的SuperDuperController的Get()方法?
是否可以自定义ASP.NET Web API的路由机制,以将所有请求路由到一个控制器方法?
如果有请求的话
www.mysite.com/api/products/
要么
www.mysite.com/api/otherResource/7
所有这些都将被路由到我的SuperDuperController的Get()方法?
我遇到了一个需要这样做的案例。 (Web API 2)
我首先考虑创建自定义 IHttpControllerSelector
和 IHttpActionSelector
秒。然而,这有点模糊不清。所以我最终确定了这个死的简单实现。您所要做的就是设置通配符路由。例:
public class SuperDuperController : ApiController
{
[Route("api/{*url}")]
public HttpResponseMessage Get()
{
// url information
Request.RequestUri
// route values, including "url"
Request.GetRouteData().Values
}
}
任何以“api /”开头的GET请求都将路由到上述方法。这包括您问题中的上述网址。您必须自己从请求或上下文对象中挖掘出信息,因为这样可以绕过自动路由值和模型解析。
关于这一点的好处是你仍然可以使用其他控制器(只要它们的路由不以“api /”开头)。
我不知道你为什么要这样做,我当然不建议通过一个控制器路由所有东西,但是你可以按如下方式实现。假设您的呼叫中只有一个具有可选ID的资源,请将其添加到WebApiConfig中:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{resource}/{id}",
defaults: new { controller = "SuperDuper", id = RouteParameter.Optional }
);
}
}
然后按如下方式定义控制器方法:
public class SuperDuperController : ApiController
{
public IHttpActionResult Get(string resource, int? id = null)
{
return Ok();
}
}
你需要决定一个合适的 IHttpActionResult
返回每种不同类型的资源。
或者使用属性路由,确保 config.MapHttpAttributeRoutes()
存在于WebApiConfig中,并将以下属性添加到控制器方法:
[RoutePrefix("api")]
public class SuperDuperController : ApiController
{
[Route("{resource}/{id?}")]
public IHttpActionResult Get(string resource, int? id = null)
{
return Ok();
}
}