ASP.NET Web API 2覆盖继承的属性路由操作找到的多个操作

时间:2018-06-07 13:21:04

标签: c# inheritance asp.net-web-api override attributerouting

为了在我的Web API中保持概述,我使用的是一个基本控制器,其中包含我的大多数其他控制器使用的一些基本操作。 (例如Post([FromBody]JObject newFields)添加新项目。)

在我的项目中,我启用了属性路由。所以我的基本控制器看起来有点如下:

public class BaseController<T> : ApiController where T : ObjectBase, new()
{
    [Route("")]
    [ResponseType(typeof(ObjectBase))]
    public virtual IHttpActionResult Post([FromBody]JObject newFields)
    {
        // Post logic
        return Ok();
    }
}

我在项目中的大多数其他控制器中继承了这个基本控制器。

现在我的问题:

在我的一个控制器中,我想覆盖这个方法,因为一些创建逻辑是不同的。

这是我尝试实现该功能的一个示例:

[RoutePrefix("api/Users")]
public class UsersController : BaseController<UserObject>
{
    [Route("")]
    [ResponseType(typeof(ObjectBase))]
    public override IHttpActionResult Post([FromBody]JObject newFields)
    {
        // Overridden post logic
        return Ok();
    }
}

但是,当我现在向POST发送https://url/api/Users请求时,我收到以下错误回复:

  

消息:

     
    

发生了错误。

  
     

ExceptionMessage:

     
    

找到符合请求的多项操作:

         

在WebAPI.Controllers.UsersController类型上发布

         

在WebAPI.Controllers.UsersController类型上发布

  
     

ExceptionType:

     
    

System.InvalidOperationException

  
     

堆栈跟踪:

     
    

at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)

         

at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken cancellationToken)

         

at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()

  

任何可以帮我解决这个问题的人都会这样做吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

在尝试了很多东西之后,我终于找到了一个最简单的解决方案。 好像我只需要删除派生类中的属性。

因此,要按照我在原始帖子中使用的示例,UsersController现在看起来像这样:

[RoutePrefix("api/Users")]
public class UsersController : BaseController<UserObject>
{
    public override IHttpActionResult Post([FromBody]JObject newFields)
    {
        // Overridden post logic
        return Ok();
    }
}