Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找到多个与请求匹配的操作:WebAPI 2_C#_Asp.net Web Api - Fatal编程技术网

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
    方法。(我会避免这个)
  • 如果选择选项1,则API uri必须是
    ../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
    方法。(我会避免这个)
  • 如果选择选项1,则API uri必须是
    ../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?