【问题标题】:WebApi2 attribute routing inherited controllersWebApi2 属性路由继承的控制器
【发布时间】:2014-09-17 10:52:57
【问题描述】:

我正在尝试使用这样的基本控制器创建基本的 REST api:

基类:

public abstract class WebApiEntityController<TEntity> : ApiController
    where TEntity : EntityBase<TEntity, int>
{
    private readonly IRepository<TEntity> _repository; 
    protected WebApiEntityController(IRepository<TEntity> repository)
    {
        _repository = repository;
    }

    [Route("")]
    [WebApiUnitOfWork]
    public HttpResponseMessage Get()
    {
        return Request.CreateResponse(HttpStatusCode.OK, _repository.ToList());
    }
    [..........]

派生类:

[RoutePrefix("api/TimesheetTask")]
public class TimesheetTaskController : WebApiEntityController<TimesheetTask>
{
    private readonly IRepository<TimesheetTask> _timeSheetTaskRepository;

    public TimesheetTaskController(IRepository<TimesheetTask> timeSheetTaskRepository) : base(timeSheetTaskRepository)
    {
        _timeSheetTaskRepository = timeSheetTaskRepository;
    }
}

但是在路由 ~/api/TimesheetTask/ 上调用 GET 会导致 404 未找到。

根据this的回答,属性路由不能被继承。所以我的问题是,如何为我的所有领域模型编写一致的 API 而无需复制和粘贴代码?

我知道我可以使用此配置进行约定路由:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

但是我必须指定操作,我的端点将是

/api/{controller]/Get
/api/{controller]/Post

我不希望那样。我也可以删除 routeTemplate 的 {action} 部分,但是我将如何路由到自定义操作?

如果有人可以提供帮助,将不胜感激。此外,我的域模型 API 的下一步将涉及支持查询,这很容易变得复杂。是否有为您生成这些路线的库?如果有人能帮我找到这样的图书馆,将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    您引用的答案已更新。从 WebApi 2.2 开始,他们创建了一个扩展点来允许您想要的功能。 属性 rout 可以继承,但需要配置。我对基本 API 控制器有相同的要求,在搜索后遇到了您引用的相同答案。

    .NET WebAPI Attribute Routing and inheritance

    你需要覆盖DefaultDirectRoutePrivider:

    public class WebApiCustomDirectRouteProvider : DefaultDirectRouteProvider {
        protected override System.Collections.Generic.IReadOnlyList<IDirectRouteFactory>
            GetActionRouteFactories(System.Web.Http.Controllers.HttpActionDescriptor actionDescriptor) {
            // inherit route attributes decorated on base class controller's actions
            return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
        }
    }
    

    完成后,您需要在 Web api 配置中对其进行配置

    public static class WebApiConfig {
        public static void Register(HttpConfiguration config) {
            .....
            // Attribute routing. (with inheritance)
            config.MapHttpAttributeRoutes(new WebApiCustomDirectRouteProvider());
            ....
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 2014-11-27
      • 2019-02-19
      • 2014-01-12
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多