2017-08-03 11 views
2

私はバージョンに自分のWeb APIを試す問題のビットを持っている:のWeb 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

これが可能である行うことができるようにしたいのですが?

EDIT


は、私が試したことの一つは、異なる名前空間には、2つの異なるコントローラにそれらを分割されました。

これは複数のアクションを検出するのと同じエラーがあります。

マイ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を聞かせて、あなた私はHTTP `に行くときあなたのコントローラが同じ名前空間にしましょうと名前だけに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

を変更することができ、私は、これを試してみました:// localhostを:?53713/API/V2.0 /モニター/ Getheartbeatハートビート= 555 「私は今、バーサリオnは必須ですが指定されていません。 – Stuart

+0

[RoutePrefix( "api/v2.0/monitors")] 'を[RoutePrefix(" api/v {version:apiVersion}/monitors ")に変更することで、 – Stuart

関連する問題