gpt4 book ai didi

c# - 网络 API : Same Method with different HTTP Verbs

转载 作者:行者123 更新时间:2023-11-30 13:25:57 27 4
gpt4 key购买 nike

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

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


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

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

500 : "Message":"An error has occurred.","ExceptionMessage":"Not supported by Swagger 2.0: Multiple operations with path 'api/Common' and method 'POST'. See the config setting - \"ResolveConflictingActions\" for a potential workaround"

这是我的路由配置:

  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 检测到可能存在歧义的路由时,它会因该错误而崩溃。歧义路由是返回不止一种资源的单个路由(基本 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 的人带来问题。

希望这对您有所帮助。

关于c# - 网络 API : Same Method with different HTTP Verbs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35000024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com