我想我发现了一个webapi错误。
这是我有这个控制器的问题的简化版本,其路由获取列表假设链接到employeeId
[RoutePrefix("/divisions/{parentId}/employees/{employeeId}/dependent")]
public class EmployeeDependentController : ParentBasedListController<EmployeeDependentDTO, GlobalEntityKey<IEmployee>>
{
[HttpGet]
[ReadRoute("")]
public override EmployeeDependentDTO[] GetList(GlobalEntityKey<IEmployee> employeeId, bool keysOnly = false)
{
return base.GetList(employeeId, keysOnly);
}
protected override EmployeeDependentDTO[] GetListImp(GlobalEntityKey<IEmployee> employeeKey)
{
return GlobalFactory<IEmployeeDependentService>.Instance.GetList(employeeKey);
}
}
然而,它继承自基类,其参数名称通常链接到parentId
public abstract class ParentBasedListController<TEntityDTOHeader, TEntityDTOKey, TParentEntityKey> : ApiController
where TParentEntityKey : IKey
where TEntityDTOHeader : TEntityDTOKey
{
#region Public Methods
[HttpGet]
[ReadRoute("")]
public virtual TEntityDTOKey[] GetList(TParentEntityKey parentId, bool keysOnly = false)
{
if (false == keysOnly)
{
return this.GetListImp(parentId).Cast<TEntityDTOKey>().ToArray();
}
return this.GetKeyListImp(parentId);
}
#endregion
#region Protected Methods
protected abstract TEntityDTOHeader[] GetListImp(TParentEntityKey parentKey);
#endregion
}
当我覆盖get list方法时,webapi会为重复的匹配操作返回错误。更有趣的是,我尝试使用new关键字,在我收到此错误的情况下应该隐藏该方法。
为什么会这样?这是webapi中的一个错误吗?我知道他们正在使用控件的反射,但他们应该能够确定是否覆盖了一个方法并使用了正确的方法。
我有几个控制器绑定到这个路由,并且有几个控制器继承了这个基类,这两个控件都很容易改变,最好的解决方法是什么?