2017-08-03 74 views
2

:以上網站我有一點想版本我的Web API的問題API版本URL

[ApiVersion("1.0")] 
[ApiVersion("2.0")] 
[System.Web.Http.Route("api/v{version:apiVersion}/monitors")] 
[ControllerName("Monitors")] 
public sealed class MonitorsController : ApiController 
{ 
    /* 
    /monitors/get?heartbeat=foo 
    */ 
    [System.Web.Http.Route("api/v{version:apiVersion}/monitors/get")] 
    [MapToApiVersion("1.0")] 
    public JsonResult GetHeartbeatStatusV1(string heartbeat) 
    { 
     var x = new JsonResult {Data = "heartbeat v1"}; 
     return x; 
    } 
    [System.Web.Http.Route("api/v{version:apiVersion}/monitors/get")] 
    [MapToApiVersion("2.0")] 
    public JsonResult GetHeartbeatStatusV2(string heartbeat) 
    { 
     var x = new JsonResult { Data = "heartbeat v1" }; 
     return x; 
    } 
    /* 
     /monitors/get?alert=foo 
    */ 
    [System.Web.Http.Route("api/v{version:apiVersion}/monitors/get")] 
    [MapToApiVersion("2.0")] 
    public JsonResult GetAlertStatus(string alert) 
    { 
     var x = new JsonResult {Data = "alerts"}; 
     return x; 
    } 
    /* 
     /monitors/get?oDataQuery=foo 
    */ 
    [System.Web.Http.Route("monitors/get")] 
    public JsonResult GetODataQuery(string oDataQuery) 
    { 
     var x = new JsonResult {Data = "oDataQuery"}; 
     return x; 
    } 
} 

是我的控制器。我有一些我想基於版本可以調用的操作。

的問題是我還需要他們全部是/獲取隨後將上面的方法來調用基於參數名稱決定,這就是爲什麼我有:

[System.Web.Http.Route("api/v{version:apiVersion}/monitors/get")] 

我想我可以裝飾與方法[MapToApiVersion("1.0")][MapToApiVersion("2.0")]來區分哪個方法被調用。 但是,如果我打電話給api/v1.0/monitors/get?heartbeat=foo,我會收到有關多個操作的錯誤。如果我打電話到v2.0,它說它根本找不到任何方法。

我希望能夠做到

http://foo:blah/api/v1.0/monitors/get?heartbeat=foo

http://foo:blah/api/v2.0/monitors/get?heartbeat=foo

http://foo:blah/api/v2.0/monitors/get?alert=foo

這可能嗎?

編輯


有一件事我試圖劈開它們分成2級不同的控制器,在不同的命名空間。

[ApiVersion("2.0")] 
[System.Web.Http.Route("api/v{version:apiVersion}/monitors")] 
[ControllerName("Monitors")] 
public sealed class MonitorsController : ApiController 
{ 
    /* 
     /monitors/get?heartbeat=foo 
    */ 
    [System.Web.Http.Route("api/v{version:apiVersion}/monitors/get")] 
    [MapToApiVersion("2.0")] 
    public JsonResult GetHeartbeatStatusV2(string heartbeat) 
    { 
     var x = new JsonResult {Data = "heartbeat v2"}; 
     return x; 
    } 
    /* 
     /monitors/get?alert=foo 
    */ 
    [System.Web.Http.Route("api/v{version:apiVersion}/monitors/get")] 
    public JsonResult GetAlertStatus(string alert) 
    { 
     var x = new JsonResult {Data = "alerts"}; 
     return x; 
    } 

} 

這與查找多個操作的錯誤相同。

我WebApiConfig.cs看起來是這樣的:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 
     var constraintResolver = new DefaultInlineConstraintResolver 
           { 
            ConstraintMap = 
            { 
             ["apiVersion"] = typeof(ApiVersionRouteConstraint) 
            } 
           }; 
     config.MapHttpAttributeRoutes(constraintResolver); 
     config.AddApiVersioning(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/v{version:apiVersion}/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

回答

2

你正在做它的方式是正確的,但不是使用ApiVersion屬性你可以把它更加簡單易讀 就讓MapHttpRoute爲默認,你可以讓你的控制器在同一個名字,只是更改名稱MonitorsControllerV2

[RoutePrefix("api/V2.0/monitors")] 
public sealed class MonitorsControllerV2 : ApiController 
{ 
    /* 
     /monitors/get?heartbeat=foo 
    */ 

    [Route("GetHeartbeat")] 
    public JsonResult GetHeartbeatStatusV2(string heartbeat) 
    { 
     var x = new JsonResult {Data = "heartbeat v2"}; 
     return x; 
    } 
    /* 
     /monitors/get?alert=foo 
    */ 
     [Route(" GetAlertStatus")] 
    public JsonResult GetAlertStatus(string alert) 
    { 
     var x = new JsonResult {Data = "alerts"}; 
     return x; 
    } 

} 
+0

我想這一點,當我去'的http://本地主機:53713/API/2.0 /顯示器/ Getheartbeat心跳= 555 '我現在得到一個版本的錯誤n是必需的,但未指定。 – Stuart

+0

好吧,通過將'[RoutePrefix(「api/V2.0/monitors」)]'改爲'[RoutePrefix(「api/v {version:apiVersion}/monitors」)] – Stuart