C# Web API:使用不同HTTP谓词的相同方法
在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不接受此配置
[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应表示单个资源。
正确的方法:
[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,因为它是不明确的 以下是一些可以帮助解决此问题的方法:
希望这有帮助。在配置文件中,不要中断默认路径
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动词不应产生歧义。