1

问题

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

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

但是当我尝试在基本控制器上调用我的路由时。例如:“api/国家/代码/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);
    }
}
4

1 回答 1

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

于 2014-02-06T17:52:46.240 回答