ASP.Net Web Api Core - 无法在抽象基类中使用 CreatedAtRoute

Posted

技术标签:

【中文标题】ASP.Net Web Api Core - 无法在抽象基类中使用 CreatedAtRoute【英文标题】:ASP.Net Web Api Core - Unable to use CreatedAtRoute in abstract base class 【发布时间】:2017-10-06 16:29:34 【问题描述】:

我的 ASP.Net 核心 Web Api 项目中有一个通用抽象控制器,带有 POST 处理:

 [HttpPost]
 public async Task<IActionResult> Create([FromBody]R itemDto)
 
     var ret = await _service.CreateNewItemAsync(itemDto);
     return CreatedAtRoute("Get", new  id = ret.Id , ret);
 

“获取”路线如下所示:

 [HttpGet("id", Name = "Get")]
 public async Task<R> GetAsync(int id)
 
     var model = await _service.GetItemAsync(id);

     return model;
 

我有 2 个继承自此基本控制器的控制器类,当我尝试在其中一个控制器上进行简单获取时,我收到以下错误消息:

错误 1: 具有相同名称“Get”的属性路由必须具有相同的模板: 操作:'MyApi.WebApi.Controllers.FooController.GetAsync' - 模板:'api/foo/id' 操作:'MyApi.WebApi.Controllers.BarController.GetAsync' - 模板:'api/bar/id'

我收到此错误的原因很明显,但我不知道如何在基本控制器中使用命名路由。

谁能指出我正确的方向?

【问题讨论】:

我遇到了类似的问题 (***.com/questions/48633939/…),如果您的问题解决了,请告诉我。 【参考方案1】:

使用路由名称参数化BaseController 逻辑。从父级中删除任何路由逻辑。使用const string 参数化子控制器中的属性。然后将此字符串传递给父级:

public class BaseController : Controller

    //no routing attributes
    public IActionResult CreateImpl(string routeName)
    
        //place any logic here
        return CreatedAtRoute(routeName, new object());
    


[Route("api/[controller]")]
public class FooController : BaseController

    private const string _getRouteName = "Get_" + nameof(FooController);

    [HttpPost]
    public async Task<IActionResult> Create()
    
        return CreateImpl(_getRouteName);
    

    [HttpGet(Name = _getRouteName)]
    public override string Get()
    
        return base.Get();
    

【讨论】:

感谢您的回答。在您的代码中,您将 Get 和 Post 放在派生类中。我的代码在 BaseController 中包含所有逻辑,因为为了避免代码重复。是否有机会避免在每个派生控制器中使用相同的代码? 好吧,我读你的代码太快了。据我了解asp.net核心中的路由,我没有其他机会这样做。 @ThomasGeulen,没错,Get 和 Post 不包含任何业务逻辑。子控制器仅管理路由。由于我们不能声明多个同名路由,因此子控制器应该声明自己的路由。【参考方案2】:

使用CreatedAtAction 而不是CreateAtRoute,它仍然会返回状态201,您无需担心路由名称。感谢@CodeFuller 这就是我解决同样问题的方法。

 return CreatedAtAction(nameof(GetAsync), new  id = 123 , createObjectDto);

请参考以下链接Route Name for HttpGet attribute Name for base generic controller class in asp.net core

【讨论】:

以上是关于ASP.Net Web Api Core - 无法在抽象基类中使用 CreatedAtRoute的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ASP.Net Core Web api 中启用 CORS

ASP.Net Web Api Core - 无法在抽象基类中使用 CreatedAtRoute

无法使用 Windows 身份验证发布到 asp.net core web api

无法让 ASP.NET Core Web API 与 IIS 一起使用 [关闭]

无法在 IIS Express 中运行 ASP.NET Core Web API 项目

从 ASP.NET MVC 项目调用 .NET CORE 5 Web API 微服务时无法检索 BadRequest 错误