[英]asp.net WebApi ApiVersionUnspecified return error
我已经使用WebApi几年了,但现在似乎不起作用。 在最近的asp.net .NET Framework项目中,我已将WebApi添加到现有的MVC解决方案中。 我正在使用nuget包Microsoft.AspNet.WebApi.Versioning 3.0.1
该应用程序的配置如下:
Global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
WebApiConfig.cs
public static void Register(HttpConfiguration config)
{
var constraintResolver = new DefaultInlineConstraintResolver()
{
ConstraintMap =
{
["apiVersion"] = typeof( ApiVersionRouteConstraint )
}
};
config.MapHttpAttributeRoutes(constraintResolver);
config.AddApiVersioning();
//config.MapHttpAttributeRoutes(); //commented due to route versioning
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{version}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
API控制器位于/Controller/v1/MyControllerAPI.cs文件夹中
MyControllerAPI.cs
namespace MyProject.Controllers
{
[AllowAnonymous]
[ApiVersion("1")]
[RoutePrefix("api/v{version:apiVersion}/MyControllerAPI")]
public class MyControllerAPI : ApiController
{
private ApplicationDbContext db = new ApplicationDbContext();
[HttpGet]
[Route("GetMonthly")]
public IQueryable<Monthly> GetMonthly()
{
return db.Monthly;
}
}
}
使用邮递员调用GET api: https:// localhost:44377 / api / v1 / MyControllerAPI / GetMonthly
它返回此错误:
{
"Error": {
"Code": "ApiVersionUnspecified",
"Message": "An API version is required, but was not specified."
}
}
我的配置有什么问题? 我敢肯定,过去曾经使用过类似的配置,而且它确实有效。
我有这样的双重HomeController;
[Authorize]
[ApiVersion("1.0")]
public class HomeController : BaseApiController
{
private ILogger _logger;
public HomeController(ILogger logger) : base(logger)
{
this._logger = logger;
}
// GET api/<controller>
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/<controller>/5
public string Get(int id)
{
return "value";
}
// POST api/<controller>
public void Post([FromBody]string value)
{
}
// PUT api/<controller>/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/<controller>/5
public void Delete(int id)
{
}
}
而2.0版本就是这样;
[Authorize]
[ApiVersion("2.0")]
public class HomeController : BaseApiController
{
private ILogger _logger;
public HomeController(ILogger logger) : base(logger)
{
this._logger = logger;
}
public IEnumerable<string> Get()
{
return new string[] { "value2.0", "value3.0" };
}
// GET api/<controller>/5
public string Get(int id)
{
return "value";
}
// POST api/<controller>
public void Post([FromBody]string value)
{
}
// PUT api/<controller>/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/<controller>/5
public void Delete(int id)
{
}
}
我使用Swashbuckle并添加了一些IOperationFilter来将参数或版本控制参数的设置默认值更改为apiVersion;
public class SwaggerAuthTokenHeaderParameter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
operation.deprecated |= apiDescription.IsDeprecated();
if (operation.parameters == null)
{
return;
}
if (operation.parameters != null)
{
foreach (var parameter in operation.parameters)
{
var description = apiDescription.ParameterDescriptions.First(p => p.Name == parameter.name);
if (parameter.description == null)
{
parameter.description = description.Documentation;
}
if (parameter.@default == null)
{
parameter.@default = description.ParameterDescriptor?.DefaultValue;
}
}
operation.parameters.Add(new Parameter
{
name = "Authorization",
@in = "header",
@default = "Bearer ",
description = "Access token for the API",
required = false,
type = "string"
});
}
}
}
或者,您可以在我的github存储库中查找ApiVersioning及其更多功能:) API存储库
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.