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

C# Web API:使用不同HTTP谓词的相同方法,c#,asp.net-web-api,swagger,C#,Asp.net Web Api,Swagger,在WEB API控制器中,是否可以使用不同的HTTP谓词使用相同的方法名 [HttpGet] public string Test() { return "Success Get"; } [HttpPost] public string Test(int i) { return "Success Post"; } Swagger不接受此配置

在WEB API控制器中,是否可以使用不同的HTTP谓词使用相同的方法名

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


  [HttpPost]
        public string Test(int i)
        {
            return "Success Post";
        }
Swagger不接受此配置。我在访问API方法时遇到此错误:

500:“消息”:“发生错误”。,“异常消息”:“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检测到潜在的不明确路由时,它会因该错误而崩溃。一个不明确的路由是返回一种以上资源类型的单一路由(基本uri)。出于某些疯狂的原因,MicrosoftWebAPI允许您为同一URI返回不同的资源,而这正是人们试图使用您的Api(和炫耀)的地方

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

  • GET/apples//返回苹果列表
  • GET/apples?type=red//返回红苹果列表
  • 不正确的方式:

  • GET/apples///返回苹果列表
  • GET/apples?type=red//返回自卸车
  • Microsoft Web Api允许您使用多种方法处理单个路由,因此您可能会遇到意外创建不明确路由的严重风险

    打破虚张声势的代码示例:

    [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的用户带来问题


    希望这有帮助。

    在配置文件中,不要中断默认路径

    config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
    
    我用这种方法解决了这个问题。只需在方法开始之前使用这些行

    [Route("api/Test")]
    [Route("api/Test/{id}")]
    

    注释掉以下代码:

    config.Routes.MapHttpRoute(
             name: "DefaultApi",
             routeTemplate: "api/{controller}/{id}",
             defaults: new { id = RouteParameter.Optional }
        );
    
    config.Routes.MapHttpRoute("DefaultApiWithAction", "api/{controller}/{action}");
    
    并编写以下代码:

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

    在冲突的方法上添加单独的路由。例如一个上面的
    [Route(“GetByType”)]
    ,另一个上面的
    [Route(“GetById”)]

    或者,对于ASP.NET Core,在swagger的启动文件中添加以下配置:

     services.AddSwaggerGen(options =>
                {
                    options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
    }
    

    看起来DefaultApiByAction和DefaultApi是相同的。尝试移除其中一个。感谢您的明确解释。这真的很有帮助。他问了不同的HTTP动词,你回答了相同的动词。不同的HTTP动词不应产生歧义。