C# 找到多个与请求匹配的操作:WebAPI 2
我已经读了一些这样的文章,但没有一篇完全涵盖我的情况,所以我将在这里发布 给定以下路由配置注册:C# 找到多个与请求匹配的操作:WebAPI 2,c#,asp.net-web-api,C#,Asp.net Web Api,我已经读了一些这样的文章,但没有一篇完全涵盖我的情况,所以我将在这里发布 给定以下路由配置注册: 公共静态无效寄存器(HttpConfiguration配置) { //Web API配置和服务 //Web API路由 config.maphttpAttribute路由(); config.Routes.MapHttpRoute( 名称:“DefaultApi”, routeTemplate:“api/{controller}/{id}”, 默认值:新建{id=RouteParameter.Opt
公共静态无效寄存器(HttpConfiguration配置)
{
//Web API配置和服务
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
}
以及继承自ApicController的控制器中的以下控制器操作:
publicGetDocumentsResponse Post([FromBody]GetDocumentsRequest请求)
{
}
公共完成文档响应帖子([FromBody]完成文档请求请求)
{
}
公共类GetDocumentsRequest
{
公共字符串CorrelationId{get;set;}
公共int Id{get;set;}
公共字符串ObjectId{get;set;}
公共字符串BusinessArea{get;set;}
公共字符串用户标识{get;set;}
公共字符串SystemName{get;set;}
公共字符串SystemToken{get;set;}
公函信函详细信息{get;set;}
公共列表键值{get;set;}
}
公共类完成文档请求
{
公共字符串CorrelationId{get;set;}
公共字符串[]文档{get;set;}
}
我认为这样做足以消除IHttpActionSelector正确选择路由的歧义,但不幸的是,事实并非如此
所以我的问题是“有没有办法让这段代码正常工作,并保持在同一个控制器中?”
谢谢,,
Stephen将路由属性装饰添加到web api函数中,这将帮助选择器选择路由:
[Route("Post1")]
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request)
{
}
[Route("Post2")]
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request)
{
}
我还建议添加http方法装饰,如
[HttpPost]
或[HttpGet]
将路由属性装饰添加到web api函数中,这将帮助选择器选择路由:
[Route("Post1")]
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request)
{
}
[Route("Post2")]
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request)
{
}
我还建议添加http方法装饰,例如可以用于此操作的[HttpPost]
或[HttpGet]
在方法的route属性ontop中将路由定义为字符串,如下所示
[Route("api/controller/Post1")]
[HttpPost]
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request)
{
}
[Route("api/controller/Post2")]
[HttpPost]
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request)
{
}
你可以用这个
在方法的route属性ontop中将路由定义为字符串,如下所示
[Route("api/controller/Post1")]
[HttpPost]
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request)
{
}
[Route("api/controller/Post2")]
[HttpPost]
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request)
{
}
请求路由管道不够智能,无法确定请求主体是否与参数类型匹配(也称为重载)。(编译器足够聪明,这就是为什么它会编译,而您会遇到运行时问题。) 你有几个不同的选择
[Route()]
属性GetDocuments
,一个用于FinishDocuments
Post
方法。(我会避免这个)../API/MyController/MyActionName
,而不是../API/MyController/
。建议在方法上添加[HttpGet]
和[HttpPost]
属性
样本:
public class DocumentController : ApiController
{
// POST /api/Document/GetDocuments
[HttpPost]
[Route("GetDocuments")]
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request) { ... }
// POST /api/Document/FinishDocuments
[HttpPost]
[Route("FinishDocuments")]
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request){ ...}
}
如果选择选项2,则必须维护一个额外的代码文件
public class GetDocumentsController : ApiController
{
// POST /api/GetDocuments
[HttpPost]
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request) { ... }
}
public class FinishDocumentsController : ApiController
{
// POST /api/FinishDocuments/
[HttpPost]
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request){ ...}
}
如果你选择选项3,愿上帝怜悯你的灵魂,你将很难维持它。请求路由管道不够智能,无法确定请求主体是否与参数类型匹配(也称为重载)。(编译器足够聪明,这就是为什么它会编译,而您会遇到运行时问题。) 你有几个不同的选择
[Route()]
属性GetDocuments
,一个用于FinishDocuments
Post
方法。(我会避免这个)../API/MyController/MyActionName
,而不是../API/MyController/
。建议在方法上添加[HttpGet]
和[HttpPost]
属性
样本:
public class DocumentController : ApiController
{
// POST /api/Document/GetDocuments
[HttpPost]
[Route("GetDocuments")]
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request) { ... }
// POST /api/Document/FinishDocuments
[HttpPost]
[Route("FinishDocuments")]
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request){ ...}
}
如果选择选项2,则必须维护一个额外的代码文件
public class GetDocumentsController : ApiController
{
// POST /api/GetDocuments
[HttpPost]
public GetDocumentsResponse Post([FromBody]GetDocumentsRequest request) { ... }
}
public class FinishDocumentsController : ApiController
{
// POST /api/FinishDocuments/
[HttpPost]
public FinishDocumentsResponse Post([FromBody] FinishDocumentsRequest request){ ...}
}
如果你选择选项3,愿上帝怜悯你的灵魂,你将很难维持它。你是否打算为两人调用相同的URL?你是否打算为两人调用相同的URL?