动作错误的swagger .net核心API模棱两可的HTTP方法

Posted

技术标签:

【中文标题】动作错误的swagger .net核心API模棱两可的HTTP方法【英文标题】:swagger .net core API ambiguous HTTP method for Action Error 【发布时间】:2018-05-29 01:31:51 【问题描述】:

使用 .net Core 2 API 实现 Swashbuckle/Swagger 我现在在访问 swagger.json 时收到 500 错误:

NotSupportedException:不明确的 HTTP 操作方法 - EBisAPI.Controllers._class.HandleError (EBisAPI)。行动需要一个 Swagger 的显式 HttpMethod 绑定

我浏览了所有控制器,并查看了每个控制器的所有公共方法上的显式路由。有没有办法确定哪个方法引发了不明确的路由错误?

【问题讨论】:

【参考方案1】:

当方法在控制器中声明为公共但没有 REST 属性时,可能会发生这种情况。将方法更改为 protected 可能会解决问题。

我以前见过这种错误,通常错误消息指向罪魁祸首: EBisAPI.Controllers._class.HandleError

我猜HandleError 是您的基类中的public 方法,对吧?将其更改为 protected 并重试。

这当然只是一种可能的解决方案。如果错误消息中提到的方法是接口实现的一部分,则它不起作用,您需要查看其他解决方案之一。

【讨论】:

哇 - 不知道我是怎么错过的,甚至复制和粘贴错误 - 谢谢 我遇到了类似的问题,但是当我将 API 端点转换为受保护的方法时,它会发出 404 @devC :当然你的端点方法必须是公开的。在 sammarcows 的情况下,它是一个辅助方法,不打算被控制器公开。 对,就我而言,我有一个额外的 [Route] 注释,这导致招摇失败。我解决了。 我的问题是因为我不小心注释掉了我的[HttpGet] 属性。哎呀。【参考方案2】:

干净的方法可能是使用数据注释[NonAction] 将您的方法设置为受保护。

【讨论】:

IActionFilter 方法更改为受保护导致以下错误:Severity Code Description Project File Line Suppression State Error CS0737 'OrderController' does not implement interface member 'IActionFilter.OnActionExecuting(ActionExecutingContext)'. 'OrderController.OnActionExecuting(ActionExecutingContext)' cannot implement an interface member because it is not public. 但是 [NonAction] 成功了【参考方案3】:

类似于totonho's answer你可以使用

[ApiExplorerSettings(IgnoreApi=true)]

(来自https://github.com/domaindrivendev/Swashbuckle/issues/153)

【讨论】:

是的!我必须在我的一条路线中添加 IgnoreApi = true 。然后swagger ui就开心了。【参考方案4】:

我通过使用正确的 HTTP 属性修饰错误中提到的方法解决了这个错误。例如:[HttpGet]

此代码抛出错误:

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()
    ;

【讨论】:

【参考方案5】:

正如我在"Swashbuckle not creating swagger.json file" 提到的:

    使用显式 Http 方法装饰所有操作,例如[HttpGet("xxx")][HttpPost("xxx")] 或 ... 而不是 [Route("xxx")]。 使用[NoAction] 属性装饰控制器中的公共方法。

【讨论】:

为什么要在控制器中使用公共方法而不需要操作? 对于代码重用,也许您希望有一个在操作中被多次调用且不在其他控制器或其他地方使用的方法。 @jorn.Beyers 如果没有在其他控制器或其他地方使用,你标记为私有? 是的,您也可以使用私有。但是,如果您使用不用作操作的公共方法,我们必须用[NoAction] 装饰它。这个案例很少使用,但也许你在我还没有遇到过的特殊情况下需要它。 (例如。使用反射来反映公共方法或...)。@Jorn.Beyers【参考方案6】:

我遇到了同样的问题,因为我已经完成了 Ok() 方法的覆盖,返回了 OkObjectResult。解决方案是将其从公共更改为受保护

【讨论】:

【参考方案7】:

我尝试了不同的解决方案,但它对我有用的是在属性中添加路由,如上所述。 IE:[HttpPost("yourRoute/create")] 问题之一是我有 2 个 get 方法,所以我更改了它们的名称,并按照我所说的将路由添加到属性。

【讨论】:

以上是关于动作错误的swagger .net核心API模棱两可的HTTP方法的主要内容,如果未能解决你的问题,请参考以下文章

Swagger json 正在显示不需要的模式,例如 .net 核心 Web api 中的默认对象元数据

swagger : 无法加载 API 定义 undefined /swagger/v1/swagger.json

如何在 ASP .Net 核心的 Swagger 中添加基本授权标头

动作需要 Swagger 的唯一方法/路径组合

.Net Core Web API Swagger 没有找到该网址的网页:http://localhost/swagger

当我尝试将 Get API 中的 json 对象作为 C# ASP.Net 中的查询字符串参数传递时,Swagger 给出错误