【问题标题】:asp.net WebApi ApiVersionUnspecified return errorasp.net WebApi ApiVersionUnspecified 返回错误
【发布时间】:2019-08-05 13:36:41
【问题描述】:

我使用 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;
        }
    }
}

使用 Postman 调用 GET api:https://localhost:44377/api/v1/MyControllerAPI/GetMonthly

它返回此错误:

{
    "Error": {
        "Code": "ApiVersionUnspecified",
        "Message": "An API version is required, but was not specified."
    }
}

我的配置有什么问题?我很确定过去曾使用过类似的配置,而且效果很好。

【问题讨论】:

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


    【解决方案1】:

    我有这样的双 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 Repo

    【讨论】:

      猜你喜欢
      • 2018-06-29
      • 2019-03-25
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多