Web API:具有不同 HTTP 动词的相同方法

2023-11-29

在 WEB API 控制器中,我们可以使用相同的方法名称和不同的 HTTP 动词吗?

  [HttpGet]
        public string Test()
        {
            return "Success Get";
        }


  [HttpPost]
        public string Test(int i)
        {
            return "Success Post";
        }

Swagger 不接受此配置。访问 API 方法时出现此错误:

500:“Message”:“发生错误。”,“ExceptionMessage”:“Swagger 2.0 不支持:路径“api/Common”和方法“POST”的多个操作。请参阅配置设置 - \“ResolveConflictingActions\”寻找潜在的解决方法”

这是我的routeconfig:

  config.Routes.MapHttpRoute(
                name: "DefaultApiByName",
                routeTemplate: "api/{controller}/{action}/{name}",
                 defaults: new { id = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: "DefaultApiByAction",
                routeTemplate: "api/{controller}/{action}"
                );

            config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id=RouteParameter.Optional});

对于 Swagger 来说,方法名称本身并不重要,重要的是路由。当 Swagger 检测到潜在不明确的路线时,它会因该错误而爆炸。不明确的路由是返回超过 1 种资源类型的单个路由(基本 uri)。由于某些疯狂的原因,Microsoft Web Api 允许您为相同的 URI 返回不同的资源,这就是当人们试图使用您的 API(和 Swagger)时您会遇到麻烦的地方。

单个 URI 应代表单个资源。
正确方法:

  1. GET /apples // 返回苹果列表
  2. GET /apples?type=red // 返回红苹果列表

不正确的方法:

  1. GET /apples/ // 返回苹果列表
  2. GET /apples?type=red // 返回一辆自卸卡车

Microsoft Web Api 允许您使用多种方法处理单个路由,因此您面临意外创建不明确路由的非常严重的风险。

破坏 Swagger 的代码示例:

[HttpGet, Route("apples")]
public HttpResponseMessage GetApples()
{
    return _productRepository.Get(id);
}

[HttpGet, Route("apples")]
pblic HttpResponseMessage GetApples([FromUri]string foo)
{
    return new DumpTruck(); // Say WHAAAAAAT?!
}

许多 Swagger 框架会在运行时扫描您的代码并创建 Swagger 2.0 JSON 文档。 Swagger UI 请求该 JSON 文档并基于该文档构建您看到的 UI。
现在,由于 Swagger 框架正在扫描您的代码以构建 JSON,因此如果它看到代表单个资源的两个方法返回不同类型,则会中断。发生这种情况是因为 Swagger 不知道如何表示该 URI,因为它不明确。

您可以采取以下一些措施来帮助解决此问题:

  1. 确保您使用单一资源类型表示单一路由(基本 URI)。
  2. 如果您必须表示具有不同类型的单个路由(通常是一个坏主意),那么您可以通过向有问题的方法添加以下属性来忽略使文档不明确的路由

    [ApiExplorerSettings(IgnoreApi = true)]

这将告诉文档在记录 API 时完全忽略此方法,并且 Swagger 将呈现。请记住,如果您使用#2,那么 Swagger 将不会呈现此方法,这可能会给使用您的 API 的人带来问题。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web API:具有不同 HTTP 动词的相同方法 的相关文章

随机推荐

  • 从未收到 GKMatchmaker findMatchForRequest 邀请

    我正在尝试邀请附近的玩家参加比赛 但邀请要么从未发送 要么从未收到 GKMatchMaker startBrowsingForNearbyPlayersWithHandler 可以工作并返回使用同一 wifi 的附近玩家 但随后我使用 fi
  • Neo4J 查询时出现 OutOfMemory 错误

    我最近开始使用 Neo4J 到目前为止我还无法找到我遇到的问题的答案 特别是服务器方面的问题 我使用的是 1 8 1 版本 并将服务器作为 Windows 上的服务运行 而不是嵌入的 我的图表有大约 700 万个节点和近 1100 万个关系
  • 如何从 PHAsset 获取 ALAsset URL?

    您可以使用以下方法偷偷地做 无证的 PHAsset ALAssetURL财产 但我正在寻找有记录的东西 在 Objective C 中 这会有所帮助 interface PHAsset Sneaky property nonatomic r
  • 上传失败:您的免安装应用 APK 应至少包含一个基本 APK

    我需要为即时应用程序准备 Alpha 测试 它在 Android Studio 上运行起来就像一个魅力 但当我尝试将其上传到 PlayStore 时它失败了 说 上传失败 您的免安装应用 APK 应至少包含一个基本 APK 应用程序结构使用
  • 将 UDP 输入传送到 FFMPEG

    摄像机正在本地端口上通过 UDP 以 RTP 形式向我发送视频数据 ffmpeg 是否支持将输入 H 264 有效负载 自动转换为 MP4 怎么做 这应该有效 ffmpeg i udp localhost 1234 vcodec copy
  • 如何在Python中有效地检查给定的IP地址是否属于IP子网?

    我有一组大约 200 000 个 IP 地址和 10 000 个 1 1 1 1 24 形式的子网 对于每个 IP 地址 我需要检查它是否属于这些子网之一 但由于它是一个如此大的数据集 而且我的计算能力较低 我希望对此有一个有效的实现 在搜
  • mysql存储过程从表中设置值

    我有一个简单的表如下 mysql gt select from version id version 1 1 1 row in set 0 00 sec 我需要创建一个存储过程 它将根据该表的值 准确地说 该表的唯一行 执行某些操作 或不执
  • Excel 宏通过 powershell 运行,但在 Windows 任务计划程序运行时不运行

    我有一个脚本检查 Excel 文件的文件夹 然后如果此 阈值 大于 0 则运行另一个 Excel 文件中的宏来与这些 Excel 文件夹交互 当我通过 powershell ISE 手动运行该进程时 它工作正常 但是当我使用 Windows
  • 确定绑定到事件的事件处理程序列表

    我有一个无法关闭的 WinForms 表单 在 OnFormClosing 中 e Cancel 设置为 true 我猜测我的应用程序中的某些对象已绑定到 Closing 或 FormClosing 事件 并且正在阻止关闭 为了找到答案 我
  • 有没有办法在 linq 查询中参数化方法?

    在我使用 Linq to SQL 的应用程序中 用户可以搜索文本 可以在搜索表达式的开头和 或结尾使用星号 现在的代码是这样的 var search SearchTextBox Text Trim bool filterStartsWith
  • 读取串行输入并打印到 Tkinter GUI

    我正在尝试制作一个基于 Tkinter 的 GUI 用于 Arduino 打印传感器值并响应用户输入 我试图用来消除 while 循环的代码是这样的 它不打印任何传感器信息 唯一的输出是 正在尝试 dev ttyACM0 然后打开 tkin
  • 获取 .bat 文件中的图像文件尺寸

    我有一个bat文件 列出了文件夹中所有图像的路径 代码是 echo off break gt infofile txt for f delims F in dir b s bmp do echo F 1 1 1 100 100 gt gt
  • 如何在 nginx 中包含位置块?

    我在用着nginx作为 2 个网络应用程序的反向代理 这两个网络应用程序 UI 共享位置代理 因为后端服务是共享的 如何组合位置块并将它们包含在服务器中 主机配置文件 server server name app1 com listen 8
  • 加密加密属性文件中的密码

    Problem 我正在使用 Apache CXF 3 0 7 并在新功能您可以在加密属性文件中存储密钥库密码的 BASE 64 编码 加密版本 但我不知道如何添加它 我没有找到此实现的示例 在 apache web 中说 加密属性文件内容的
  • 为什么 NULL = NULL 在 SQL Server 中计算结果为 false

    在 SQL Server 中 如果你有nullParam NULL在 where 子句中 它的计算结果始终为 false 这是违反直觉的 给我带来了很多错误 我确实明白IS NULL and IS NOT NULL关键字是正确的方法 但为什
  • 如何解决 Multer 错误:意外的表单结束?

    我发现了有关 Multer 的其他类似问题 但没有答案 我正在尝试使用 next js 前端 和 node js 后端 上传文件 使用开发工具时 数据是通过网络选项卡发布的 以下是我的设置 app js const express requ
  • iOS 6.0 MPMoviePlayerController 全屏模式黑色?然后应用程序不再阻止任何操作

    当屏幕为黑色时 MPMoviePlayerController 视频将进入全屏模式 然后该应用程序就被屏蔽了 此问题仅适用于 iOS 6 0 但 iOS 5 1 运行良好 这是我的代码 如果我双击播放器全屏打开 但显示黑屏 self mov
  • PHP 数组语法:array(...) 或 [...] [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 PHP 中 这些相同吗 x 1 2 3 and x array 1 2 3 这两种创建数组的方法是否存在不同的情况 有什么理由使用其中一种而不是另一种吗 它们与警告相同 x 1 2 3
  • 在 Access 中从另一个表的数据创建一个表

    这个问题是关于 MS Access 的 我想做的是 我在 Access 中有一个表 并且想使用第一个表中的数据创建另一个表 希望通过一些 VBA 代码自动创建 有关于如何执行此操作的任何建议吗 我对 VBA 和 Access 很陌生 因此任
  • Web API:具有不同 HTTP 动词的相同方法

    在 WEB API 控制器中 我们可以使用相同的方法名称和不同的 HTTP 动词吗 HttpGet public string Test return Success Get HttpPost public string Test int