2017-05-02 85 views
10

我有一個基本的WebApi實現設置與默認值控制器。爲什麼'DefaultInlineConstraintResolver'無法解析'apiVersion'

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

的內部代碼

我認爲調用AddApiVersioning並提供文檔中概述的constraintResolver可以解決問題,但事實並非如此。現在我正在努力接下來要做的事情。

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

有什麼建議嗎?

回答

10

你應該解決WebApiConfig.cs版本映射路徑之前文件

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

。我的意思是在config.Routes.MapHttpRoute()

+0

沒有WebApiConfig.cs,我使用的是OWIN startup.cs類,並且在映射任何路由之前設置了約束解析器。 – Zoop

+1

您必須擁有ConfigureAuth(app);在[assembly:OwinStartup(typeof(Owin.Startup))] class中,您可以轉到該類並通過添加Microsoft.AspNet.WebApi.Versioning nuget注入上面的代碼。 – Champ

+0

你是對的,現在我只需要弄清楚如何讓Swagger識別路線。感謝你的回答! – Zoop

相關問題