用于操作错误的swagger .net核心API模糊HTTP方法

o8x7eapl  于 2023-04-06  发布在  .NET
关注(0)|答案(8)|浏览(127)

使用.net Core 2 API实现Swashbuckle/Swagger我现在在访问swagger.json时收到500错误:
不支持异常:操作的HTTP方法不明确- EBisAPI.Controllers._class.HandleError(EBisAPI)。操作需要Swagger的显式HttpMethod绑定
我已经检查了所有的控制器,并在每个控制器的所有公共方法上看到了显式路由。有没有一种方法可以确定哪个方法抛出了不明确的路由错误?

33qvvth1

33qvvth11#

当一个方法在控制器中被声明为public,但没有REST属性时,可能会发生这种情况。将方法更改为protected可以解决这个问题。
我以前见过这种错误,通常错误消息指向罪魁祸首:EBisAPI.Controllers._class.HandleError
我猜HandleError是你的基类中的一个public方法,对吧?把它改成protected,然后再试一次。
这当然只是一种可能的解决方案。如果错误消息中提到的方法是接口实现的一部分,那么它就不起作用,您需要考虑其他解决方案之一。

kkbh8khc

kkbh8khc2#

和totonho的答案相似你可以用

[ApiExplorerSettings(IgnoreApi=true)]

(From https://github.com/domaindrivendev/Swashbuckle/issues/153

nsc4cvqm

nsc4cvqm3#

干净的方法可以使用数据注解[NonAction]来将方法设置为受保护。

brjng4g3

brjng4g34#

我通过用正确的HTTP属性修饰错误中提到的方法来解决这个错误。例如:[HTTP获取]
此代码抛出错误:

public object Get()
{
    MongoDbContext dbContext = new MongoDbContext();
    return new {
        API = true,
        Database = dbContext.Status()
    };
}

此代码适用于:

[HttpGet]
public object Get()
{
    MongoDbContext dbContext = new MongoDbContext();
    return new {
        API = true,
        Database = dbContext.Status()
    };
}
5ktev3wc

5ktev3wc5#

正如我在“Swashbuckle不创建swagger.json文件”中提到的:
1.使用显式的Http方法装饰所有操作,如[HttpGet("xxx")][HttpPost("xxx")]或...,而不是[Route("xxx")]
1.使用[NonAction]属性装饰控制器中的公共方法。

xqkwcwgp

xqkwcwgp6#

我尝试了不同的解决方案,但对我来说最有效的是在属性中添加路由,如上所述。即:[HttpPost("yourRoute/create")]其中一个问题是我有两个get方法,所以我改变了它们的名字,并像我说的那样将路由添加到属性中。

quhf5bfb

quhf5bfb7#

我也遇到了同样的问题,这是因为我重写了Ok()方法,返回了一个OkObjectResult。

mbjcgjjk

mbjcgjjk8#

我也遇到了同样的问题。对我来说,错误是默认情况下WeatherForecastController或任何其他类继承自ControllerBase类。但当我创建一个新类时,它继承自Controller类。
所以ControllerBaseController类之间的冲突导致了这个问题。
然后从ControllerBase类继承新的Controller为我修复了这个问题。
不能同时从ControllerBaseController继承。

相关问题