Web API。具有属性路由的通用控制器

时间:2014-02-06 13:17:32

标签: generics asp.net-web-api routing owin attributerouting

问题

当我在实际控制器上创建一个带路由的方法时,请说: “api / country / something”......

当我执行上述请求时,我的代码将被执行&数据被返回。

但是当我尝试在基本控制器上调用我的路由时。 E.G:“api / country / code / 123”

我收到404错误。

问题

如何在利用属性路由的同时实现通用路由?

特定控制器

 [RoutePrefix("Country")]
 public class CountryController : MasterDataControllerBase<Country, CountryDto>
 {
   public CountryController(
             IGenericRepository<Country> repository, 
             IMappingService mapper, 
             ISecurityService security) : base(repository, mapper, security)
            {
            }
 }

public class MasterDataControllerBase<TEntity, TEntityDto> : ControllerBase
    where TEntity : class, ICodedEntity, new()
    where TEntityDto : class, new()
{
    private readonly IMappingService mapper;

    private readonly IGenericRepository<TEntity> repository;

    private readonly ISecurityService security;

    public MasterDataControllerBase(IGenericRepository<TEntity> repository, IMappingService mapper, ISecurityService security)
    {
        this.security = security;
        this.mapper = mapper;
        this.repository = repository;
    }

    [Route("code/{code}")]
    public TEntityDto Get(string code)
    {
        this.security.Enforce(AccessRight.CanAccessMasterData);

        var result = this.repository.FindOne(o => o.Code == code);

        return this.mapper.Map<TEntity, TEntityDto>(result);
    }
}

1 个答案:

答案 0 :(得分:3)

Web API中的属性路由不支持Route属性的继承。如果您查看Inherited = false类的定义...

,则可以看到RouteAttribute指示的内容
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public sealed class RouteAttribute : Attribute, IDirectRouteFactory, IHttpRouteInfoProvider
{ ...

这解释了为什么你得到404,因为Route属性实际上消失了。

由于该属性不可继承且类是密封的,我不知道是否有办法使用开箱即用的属性路由基础结构。

更新:Web API团队的一名成员解释说,这是一项设计决定,它不会被继承...... https://stackoverflow.com/a/19989344/3199781