【问题标题】:API versioning in Asp.net Web API 2 Query string parameter versioningAsp.net Web API 2 中的 API 版本控制查询字符串参数版本控制
【发布时间】:2017-02-23 07:18:00
【问题描述】:

我想在我的 Web API 2 中实现查询字符串参数版本控制

已安装 nuget 包:Install-Package Microsoft.AspNet.WebApi.Versioning

WebApiConfig.cs

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/v{version}/default/{action}/{id}",
                defaults: new { Controllers="Default", Version="1.0", id = RouteParameter.Optional }
            ); 

控制器

[ApiVersion("2.0")]
    [ApiVersion("1.0", Deprecated = true)]
    //[Route("api/v{version:apiVersion}/[controller]")]
    public class DefaultController : ApiController
    {
        public HttpResponseMessage Get()
        {
            return new HttpResponseMessage()
            {
                Content = new StringContent("GET: Default Test message")
            };
        } 

        //This action mapped to Version 2.0
        [HttpPost,MapToApiVersion("2.0")]
        public HttpResponseMessage GetProduct(Product item)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }

            return Request.CreateResponse(HttpStatusCode.OK, item.Name);
            // Implementation not shown...
        }
    } 

我想使用 URI 访问 API:api/v2.0/default/GetProduct

但是,得到消息没有找到与请求 URI 匹配的 HTTP 资源

【问题讨论】:

  • 为什么GetProduct 操作是[HttpPost] 请求?
  • GetProduct 是动作名称,需要使用的方法类型是 [HttpPost] 所以,GetProduct 只是命名(可以是任何东西)。

标签: c# api asp.net-web-api asp.net-core asp.net-web-api2


【解决方案1】:

您的问题说您希望按查询字符串进行版本控制,但代码和示例表明您希望按 URL 段进行版本控制。您可能想澄清您的问题。我假设你的意思是 URL 段。

这不起作用的原因是您没有应用 ApiVersionRouteConstraint。正如定义的那样,{version} 路由参数被视为普通的旧字符串,这将不起作用。

正确的设置是:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/v{version}/{controller}/{action}/{id}",
    defaults: new { controller = "Default", id = RouteParameter.Optional },
    constraints: new { version = new ApiVersionRouteConstraint() },
); 

您不能有默认值,除非它们位于模板的末尾。这意味着{Version="1.0"} 将无效并且可以省略。 version 的名称可以是任何您想要的名称,只要它与模板中指定的名称匹配即可。

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多