无法获得在 Web Api C# 中工作的 Api 版本
Unable to get ApiVersion working in Web Api C#
我正在尝试使用我在热门 on-line 站点找到的教程来控制我的 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();
}
}
}
我尝试将 header 键设置为版本,将值设置为 1.0,但我被路由到版本 2.0 的控制器。将 header 值设置为 2.0 有效。离开 header key/value 也会路由到控制器 2。
Microsoft.Web.Http.Versioning
命名空间中有 4 个预定义的版本选择器:
CurrentImplementationApiVersionSelector
如果在请求中指定 none,则选择最新的 api 版本。
如果在请求中指定了 none,LowestImplementedApiVersionSelector
选择最低的 api 版本。
如果在请求中指定了 none,ConstantApiVersionSelector
选择在构造函数中传递的常量 api 版本。
DefaultApiVersionSelector
如果在请求中指定 none,则在 ApiVersioningOptions
中选择 DefaultApiVersion
。
所以如果你想默认选择DefaultApiVersion
你需要使用DefaultApiVersionSelector
//or just remove this line since this is a default selector
ver.ApiVersionSelector = new DefaultApiVersionSelector(ver);
如果版本控制仍然不起作用,您可能以错误的方式或其他方式设置了 Version
header 值。您还可以检查它是否适用于其他版本的阅读器,例如 QueryStringApiVersionReader
。更新配置
ver.ApiVersionReader = new QueryStringApiVersionReader("version");
并在查询字符串中传递版本
/api/values?version=1
我正在尝试使用我在热门 on-line 站点找到的教程来控制我的 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();
}
}
}
我尝试将 header 键设置为版本,将值设置为 1.0,但我被路由到版本 2.0 的控制器。将 header 值设置为 2.0 有效。离开 header key/value 也会路由到控制器 2。
Microsoft.Web.Http.Versioning
命名空间中有 4 个预定义的版本选择器:
CurrentImplementationApiVersionSelector
如果在请求中指定 none,则选择最新的 api 版本。
如果在请求中指定了 none,LowestImplementedApiVersionSelector
选择最低的 api 版本。
如果在请求中指定了 none,ConstantApiVersionSelector
选择在构造函数中传递的常量 api 版本。
DefaultApiVersionSelector
如果在请求中指定 none,则在 ApiVersioningOptions
中选择 DefaultApiVersion
。
所以如果你想默认选择DefaultApiVersion
你需要使用DefaultApiVersionSelector
//or just remove this line since this is a default selector
ver.ApiVersionSelector = new DefaultApiVersionSelector(ver);
如果版本控制仍然不起作用,您可能以错误的方式或其他方式设置了 Version
header 值。您还可以检查它是否适用于其他版本的阅读器,例如 QueryStringApiVersionReader
。更新配置
ver.ApiVersionReader = new QueryStringApiVersionReader("version");
并在查询字符串中传递版本
/api/values?version=1