【问题标题】:The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'apiVersion'“DefaultInlineConstraintResolver”类型的内联约束解析器无法解析以下内联约束:“apiVersion”
【发布时间】:2017-09-30 03:42:47
【问题描述】:

我有一个带有默认值控制器的基本 WebApi 实现设置。

reading a blog about RESTful WebApi Versioning之后我决定将包集成到一个新的WebApi项目中。

我添加了 NuGet 包 Microsoft.AspNet.WebApi.Versioning 来帮助我的 API 版本控制。这是我正在关注的包配置说明的 URL:

https://github.com/Microsoft/aspnet-api-versioning/wiki/Configuring-Your-Application

我的价值观控制器非常简单。我已将装饰添加到我的 Get 方法中。代码如下:

[Authorize]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/values")]
public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
    
    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)
    {
    }
}

不幸的是,只要我将以下代码行添加到控制器,整个事情就会爆炸:

[Route("api/v{version:apiVersion}/values")]

下面是返回的错误消息:

The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'apiVersion'. 

Line 82:             GlobalConfiguration.Configure(WebApiConfig.Register);

这是我的 Startup.cs 中的代码

public void Configuration(IAppBuilder app)
{
    // HTTP Configuration
    HttpConfiguration config = new HttpConfiguration();
    //config.MapHttpAttributeRoutes();

    // Configure API Versioning
    config.AddApiVersioning();
    var constraintResolver = new DefaultInlineConstraintResolver()
    {
        ConstraintMap =
        {
            ["apiVersion"] = typeof( ApiVersionRouteConstraint ) // or mvc routing?
        }
    };
    config.MapHttpAttributeRoutes(constraintResolver);   

    // Configure the API to accept token authentication
    ConfigureOAuthTokenConsumption(app);

    // CORS
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

    // Configure the Authorization server
    ConfigureOAuth(app);

    // Use WebAPI
    app.UseWebApi(config);

    // Moved from global.asax
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

我认为按照文档中的说明调用 AddApiVersioning 并提供 constraintResolver 可以解决问题,但事实并非如此。现在我正在为下一步做什么而苦苦挣扎。

config.AddApiVersioning();
var constraintResolver = new DefaultInlineConstraintResolver()
{
    ConstraintMap =
    {
        ["apiVersion"] = typeof( ApiVersionRouteConstraint ) // or mvc routing?
    }
};
config.MapHttpAttributeRoutes(constraintResolver);

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    您应该在 WebApiConfig.cs 文件中解析版本

         var constraintResolver = new DefaultInlineConstraintResolver()
            {
                ConstraintMap =
                {
                    ["apiVersion"] = typeof( ApiVersionRouteConstraint ) 
                }
            };
            config.MapHttpAttributeRoutes(constraintResolver); 
    

    在映射路线之前。我的意思是在 config.Routes.MapHttpRoute()

    之前

    【讨论】:

    • 没有WebApiConfig.cs,我用的是OWIN的startup.cs类,并且在映射任何路由之前正在设置约束解析器。
    • 你必须有 ConfigureAuth(app);在 [assembly: OwinStartup(typeof(Owin.Startup))] 类中,您可以转到该类并通过添加 Microsoft.AspNet.WebApi.Versioning nuget 来注入上述代码。
    • 你是对的,现在我只需要尝试弄清楚如何让 Swagger 也能识别路线。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2011-04-23
    相关资源
    最近更新 更多