【发布时间】:2016-06-28 19:01:23
【问题描述】:
我有 WebAPI 2 应用程序。如何指定 2 个或多个 POST 方法?
我有以下 WebApiConfig:
public static void Register(HttpConfiguration config)
{
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
和 API 控制器:
[RoutePrefix("api/books")]
public class BooksController : ApiController
{
[Route("Post1")]
[HttpPost]
public IQueryable<string> Post1(string str)
{
return null;
}
[Route("Post2")]
[HttpPost]
public IQueryable<string> Post2(int id)
{
return null;
}
}
我打电话都不管用:
/api/books/post1
也没有
/api/books/post2
为什么以及如何解决?
更新:
问题已解决,问题在于简单类型作为参数。我收到 404 错误
Message=未找到与请求 URI 匹配的 HTTP 资源 'http://localhost:37406/api/books/post1'。
有要求:
POST http://localhost:37406/api/books/post1 HTTP/1.1
User-Agent: Fiddler
Host: localhost:35979
Content-Type: application/json; charset=utf-8
{
"str" : "Fffff"
}
和代码:
[Route("Post1")]
[HttpPost]
public HttpResponseMessage Post1(string str)
{
return Request.CreateResponse();
}
[Route("Post2")]
[HttpPost]
public HttpResponseMessage Post2(int id)
{
return Request.CreateResponse();
}
但它适用于复杂类型:
[HttpPost]
[Route("Post1")]
public HttpResponseMessage Post1(Book book)
{
return Request.CreateResponse();
}
[HttpPost]
[Route("Post2")]
public HttpResponseMessage Post2(Book book)
{
return Request.CreateResponse();
}
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public string Genre { get; set; }
}
谢谢恩科西
更新 2:
但是当参数被标记为 [FromBody] 时它可以工作
[Route("Post1")]
[HttpPost]
public HttpResponseMessage Post1([FromBody]string str)
{
return Request.CreateResponse();
}
[Route("Post2")]
[HttpPost]
public HttpResponseMessage Post2([FromBody]int id)
{
return Request.CreateResponse();
}
(对于复杂类型是不必要的)。逻辑上,但路由错误混淆:)
【问题讨论】:
-
你用什么工具来测试你的帖子
-
没问题。如果您在参数上使用 [FromBody] 或 [FromUrl] 属性,它可以与简单类型一起使用,让框架知道在哪里查找参数。检查Parameter Binding in ASP.NET Web API。
标签: asp.net-web-api asp.net-web-api2 asp.net-web-api-routing