Asp.net:实现控制器库时方法/路径冲突

问题描述 投票:0回答:1

我定义了一个名为

BaseController
的类,它从
ControllerBase
实现,它有一个带有
[HttpGet]
的查询函数,当我定义另一个名为
UniqueController
的类从
BaseController
实现时,然后覆盖查询函数,出现错误:

Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0
// basecontroller
public class BaseController<T> : ControllerBase where T : BaseModel, new() 
{
        [HttpGet]
        public virtual async Task<IActionResult> Query()
        {
            var models = await _baseService.QueryModelAsync();
            return Ok(ApiResultHelper.Success("Success", new { Value = models }, models.Count));
        }
}
// uniquecontroller
public class UniqueController<T> : BaseController<T> where T : UniqueModel, new()
{
        public new async Task<IActionResult> Query()
        {
            var models = await _modelService.QueryModelAsync();
            return Ok(ApiResultHelper.Success("Success", new { Value = models }, models.Count));
        }
}
// module controller use
public class UserController : UniqueController<UserModel>
{
        public UserController(UniqueService<UserModel> modelService, IHttpContextAccessor httpContextAccessor) 
            : base(modelService, httpContextAccessor) {}
}
c# asp.net exception routes
1个回答
1
投票

这是因为你用

new
关键字隐藏了方法。

您需要使用

override
来定义它。

从纯语言角度思考,

new
隐藏了方法,意味着同一个方法会有两个版本。考虑简单的例子:

public class Base
{
    public virtual void VirtualMethod()
    {
        Console.WriteLine("Calling base virtual method");
    }
}

public class UniqueWithNew : Base
{
    public new virtual void VirtualMethod()
    {
        Console.WriteLine("Calling UniqueWithNew method");
    }
}

public class UserWithNew : UniqueWithNew { }

以及示例程序:

var userWithNew = new UserWithNew();

userWithNew.VirtualMethod();
Base @base = userWithNew;

Console.WriteLine("Calling user with new as Base: ");

@base.VirtualMethod();

每次

VirtualMethod()
调用都会返回不同的结果,因为它们是两种不同的方法。

Swagger 也会检测这两种方法,它们都具有

HttpGet
属性,并且会感到困惑。

© www.soinside.com 2019 - 2024. All rights reserved.