具有ID的ASP.NET WebAPI 2版本POST

问题描述 投票:0回答:1

我正在尝试在现有的生产性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 }
            );

知道我在做什么错或如何解决这个问题?

c# asp.net-web-api asp.net-web-api2 aspnet-api-versioning
1个回答
0
投票

问题是您有2个post方法,并且api不知道如何识别/生成资源名称。

您需要在自定义资源名称中添加重复方法。

[HttpPost("id")]之类的东西>

因此,例如,我们以您的示例为例,您可以将资源添加到抛出异常的资源中,而保留另一个资源,或者给它们两个提供唯一的资源名称。

© www.soinside.com 2019 - 2024. All rights reserved.