无法使ApiVersion在Web Api C#中工作

时间:2019-02-14 20:08:12

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

我正在尝试使用在一个流行的在线站点上找到的教程来对我的api调用进行版本控制。我无法路由到工作。我设置了两个控制器,版本1和版本2,但是我总是被路由到版本2。就其价值而言,我发现的教程中的代码似乎也存在相同的问题。

控制器1:

using System.Collections.Generic;
using System.Web.Http;
using Microsoft.Web.Http;

namespace WebDemoAPI.Controllers
{
    [ApiVersion("1.0")]
    [Route("api/values")]
    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            //throw new NotImplementedException("");
            return new string[] { "value1", "value2" };
        }
        // GET api/values/5
        public string Get(int id){return "value";}
        // POST api/values
        public void Post([FromBody]string value) { }
        // PUT api/values/5
        public void Put(int id, [FromBody]string value) { }
        // DELETE api/values/5
        public void Delete(int id) { }
    }
}

控制器2:

using System.Collections.Generic;
using System.Web.Http;
using Microsoft.Web.Http;

namespace WebDemoAPI.Controllers
{
    [ApiVersion("2.0")]
    [Route("api/values")]
    public class Values2Controller : ApiController
    {
        // GET: api/Values2
        public IEnumerable<string> Get()
        {
            return new string[] { "version2", "version2" };
        }

        // GET: api/Values2/5
        public string Get(int id)
        {
            return "value";
        }

        // POST: api/Values2
        public void Post([FromBody]string value)
        {
        }

        // PUT: api/Values2/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE: api/Values2/5
        public void Delete(int id)
        {
        }
    }
}

Web ApiConfig:

using System.Web.Http;
using Microsoft.Web.Http;
using Microsoft.Web.Http.Versioning;

namespace WebApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.AddApiVersioning(ver =>
            {
                ver.ReportApiVersions = true;
                ver.AssumeDefaultVersionWhenUnspecified = true;
                ver.DefaultApiVersion = new ApiVersion(1, 0);
                ver.ApiVersionReader = new HeaderApiVersionReader("version");
                ver.ApiVersionSelector = new CurrentImplementationApiVersionSelector(ver);
            });

            config.MapHttpAttributeRoutes();

        }
    }
}

我尝试将标题键设置为version,值设置为1.0,但是我被路由到2.0版的控制器。将标头值设置为2.0是可行的。保留标题键/值也将路由到控制器2。

1 个答案:

答案 0 :(得分:1)

Microsoft.Web.Http.Versioning命名空间中有4个预定义的版本选择器:

CurrentImplementationApiVersionSelector选择最新的api版本(如果请求中未指定)。
如果请求中未指定,则LowestImplementedApiVersionSelector选择最低的api版本。
如果请求中未指定,则ConstantApiVersionSelector选择在构造函数中传递的恒定api版本。
如果请求中未指定DefaultApiVersionSelector,则在DefaultApiVersion中选择ApiVersioningOptions

因此,如果您希望默认选择DefaultApiVersion,则需要使用DefaultApiVersionSelector

//or just remove this line since this is a default selector
ver.ApiVersionSelector = new DefaultApiVersionSelector(ver);

如果版本仍然无法正常工作,则您可能以错误的方式或其他方式设置了Version标头值。您还可以检查它是否适用于其他版本的阅读器,例如QueryStringApiVersionReader。更新配置

ver.ApiVersionReader = new QueryStringApiVersionReader("version");

并在查询字符串中传递版本

/api/values?version=1