加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Web API:使用不同HTTP谓词的相同方法

发布时间:2020-12-15 23:47:33 所属栏目:百科 来源:网络整理
导读:在WEB API控制器中,我们可以使用不同的HTTP谓词具有相同的方法名称吗? [HttpGet] public string Test() { return "Success Get"; } [HttpPost] public string Test(int i) { return "Success Post"; } Swagger不接受此配置.访问API方法时出现此错误: 500 :
在WEB API控制器中,我们可以使用不同的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”

这是我的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检测到可能有歧义的路线时,它会因此错误而爆炸.模糊路由是单个路由(基本uri),返回多于一种类型的资源.出于某些疯狂的原因,Microsoft Web Api允许您为同一URI返回不同的资源,这是您在尝试使用API??(和Swagger)时遇到麻烦的地方.

单个URI应代表单个资源.
正确的方式:

> GET / apples //返回一个苹果列表
> GET / apples?type = red //返回红苹果列表

方式不正确:

> GET / apples / //返回一个苹果列表
> 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,因为它不明确.

以下是一些可以帮助解决此问题的方法:

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

[ApiExplorerSettings(IgnoreApi = true)]

这将告诉文档在记录API和Swagger将呈现时完全忽略此方法.请记住,如果您使用#2,那么Swagger将不会呈现此方法,这可能会导致消费API的人出现问题.

希望这可以帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读