具有不同参数类型的 web api 多个 post 方法

C S*_*per 3 .net c# asp.net-web-api

我可以有 2 个具有不同数据类型的 post 方法,如下所示:-

[HttpPost]        
public HttpResponseMessage Post([StringBody]string data)
{
   // Logic
}

[HttpPost]
public HttpResponseMessage Post(Requirements objRequirement)
{ 
  //Logic
}
Run Code Online (Sandbox Code Playgroud)

我在邮递员中遇到以下错误:-

<Error>
    <Message>An error has occurred.</Message>
    <ExceptionMessage>Multiple actions were found that match the request: 
System.Net.Http.HttpResponseMessage Post(Newtonsoft.Json.Linq.JObject) on type ATL.Trebuchet.RestApi.Controllers.ValuesController
System.Net.Http.HttpResponseMessage Post(ATL.Trebuchet.RestApi.Models.Requirements) on type ATL.Trebuchet.RestApi.Controllers.ValuesController</ExceptionMessage>
    <ExceptionType>System.InvalidOperationException</ExceptionType>
    <StackTrace>   at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)
   at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)
   at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
   at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)</StackTrace>
</Error>
Run Code Online (Sandbox Code Playgroud)

请帮助如何使用不同类型的参数使用相同的 Post 方法

我正在发送数据作为 Text (text/plain)

编辑 1:

在此处输入图片说明

Mar*_*und 5

如果你想在同一个控制器中使用多个 post 方法,你需要将它们映射到不同的路由或操作

对于Web api 1

将路由添加到 WebApiConfig,您可以查看此答案以获取详细信息,但重要的是指定默认路由 api/controller/id 仅接受整数。否则,这些操作将被视为字符串 ID。

routes.MapHttpRoute(
    name: "ControllerAndId",
    routeTemplate: "api/{controller}/{id}",
    defaults: null,
    constraints: new { id = @"^\d+$" } // Only integers 
);
routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}"
);
Run Code Online (Sandbox Code Playgroud)

然后在控制器中指定方法之上的操作

public class DataController : ApiController
{
    [HttpPost]  
    [ActionName("post1")]      
    public HttpResponseMessage Post([StringBody]string data)
    {
       // Logic
    }

    [HttpPost]
    [ActionName("post2")]
    public HttpResponseMessage Post(Requirements objRequirement)
    { 
      //Logic
    }
}
Run Code Online (Sandbox Code Playgroud)

对于Web api 2

在这里你可以使用属性路由

[RoutePrefix("api/data")]
public class DataController : ApiController
{
    [HttpPost]  
    [Route("post1")]      
    public HttpResponseMessage Post([StringBody]string data)
    {
       // Logic
    }

    [HttpPost]
    [Route("post2")]
    public HttpResponseMessage Post(Requirements objRequirement)
    { 
      //Logic
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个 post 方法将被称为 api/data/post1 和第二个 api/data/post2