我正在尝试在现有的生产性WebAPI 2应用程序中实现'Microsoft.AspNet.WebApi.Versioning'nuget,以支持新设计的'v2'控制器。
到目前为止,大多数控制器都可以正常工作,但现在我遇到了一些POST控制器的麻烦。
示例代码:
using Microsoft.Web.Http;
using System.Web.Http;
namespace ApplicationApi.Controllers
{
[ApiVersion("1.0")]
[Route("api/version")]
public class VersionController : ApiController
{
//Works
[HttpGet]
public IHttpActionResult Get()
{
return Ok(true);
}
//Throws HTTP 405 - The requested resource with API version '1.0' does not support HTTP method 'POST'.
[HttpPost]
public IHttpActionResult Post(int id, [FromBody]dynamic value)
{
return Ok(true);
}
//Works
[HttpPost]
public IHttpActionResult Post([FromBody]dynamic value)
{
return Ok(true);
}
}
}
所有不带附加{id}的POST方法。但是,由于我们有大量的旧客户端很长时间了,因此我必须保持旧版本的正常运行,并且不能删除旧控制器中的{id}。在新的控制器中,不需要{id}。
WebAPI配置
var constraintResolver = new DefaultInlineConstraintResolver()
{
ConstraintMap =
{
["apiVersion"] = typeof( ApiVersionRouteConstraint )
}
};
config.MapHttpAttributeRoutes(constraintResolver);
config.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = true;
});
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
知道我在做什么错或如何解决这个问题?
问题是您有2个post方法,并且api不知道如何识别/生成资源名称。
您需要在自定义资源名称中添加重复方法。
[HttpPost("id")]
之类的东西>
因此,例如,我们以您的示例为例,您可以将资源添加到抛出异常的资源中,而保留另一个资源,或者给它们两个提供唯一的资源名称。