【问题标题】:Route all Web API requests to one controller method将所有 Web API 请求路由到一个控制器方法
【发布时间】:2015-09-10 10:10:57
【问题描述】:

是否可以自定义 ASP.NET Web API 的路由机制,将所有对 API 的请求路由到一个控制器方法?

如果有请求进入

www.mysite.com/api/products/

或

www.mysite.com/api/otherResource/7

所有都将被路由到我的 SuperDuperController 的 Get() 方法?

【问题讨论】:

标签: asp.net asp.net-web-api2 asp.net-web-api-routing


【解决方案1】:

我遇到了一个需要这样做的案例。 (网络 API 2)

我首先考虑创建自定义 IHttpControllerSelector 和 IHttpActionSelectors。然而,这有点模糊不清。所以我最终选择了这个简单的实现。您所要做的就是设置通配符路由。示例:

public class SuperDuperController : ApiController
{
    [Route("api/{*url}")]
    public HttpResponseMessage Get()
    {
        // url information
        Request.RequestUri
        // route values, including "url"
        Request.GetRouteData().Values
    }
}

任何以“api/”开头的 GET 请求都会被路由到上述方法。这包括您问题中的上述 URL。您必须自己从请求或上下文对象中挖掘信息,因为这会绕过自动路由值和模型解析。

这样做的好处是您仍然可以使用其他控制器(只要它们的路由不以“api/”开头)。

【讨论】:

    【解决方案2】:

    我不知道您为什么要这样做,我当然不建议通过一个控制器路由所有内容,但是您可以通过以下方式实现此目的。假设您在调用中只会有一个带有可选 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      相关资源
      最近更新 更多