2014-02-19 31 views
0

對於默認的get,post,put和delete方法,我添加了一些更多的getter,其中一些獲取參數。在實體框架Web API中爲路由設置默認操作

public class AController 
{ 
    // GET api/A 
    [HttpGet] 
    public HttpResponseMessage GetAs() { ... } 

    // GET api/A/5 
    [HttpGet] 
    public HttpResponseMessage GetA(int id) { ... } 

    // GET api/A/GetThis 
    [HttpGet] 
    public HttpResponseMessage GetThis() { ... } 

    // GET api/A/GetThat 
    [HttpGet] 
    public HttpResponseMessage GetThat() { ... } 

    // GET api/A/GetMoreInfoAbout/5 
    [HttpGet] 
    public HttpResponseMessage GetMoreInfoAbout(int id) { ... } 

    // PUT api/A 
    [HttpPut] 
    public HttpResponseMessage PutA(int id, A a) { ... } 

    // POST api/A 
    [HttpPost] 
    public HttpResponseMessage PostA(A a) { ... } 

    // DELETA api/A 
    [HttpDelete] 
    public HttpResponseMessage DeleteA(int id) { ... } 
} 

我所做的到現在是確定各方法的新途徑,所以我WebApiConfig.cs得到炸燬和它變得越來越不透明,每個新的控制器和方法。

我想這更多的通用路由:

config.Routes.MapHttpRoute(
    name: "ApiById", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: new { id = @"^[0-9]+$" } 
); 

config.Routes.MapHttpRoute(
    name: "ApiByActionId", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: null, 
    constraints: new { id = @"^[0-9]+$" } 
); 

config.Routes.MapHttpRoute(
    name: "ApiByAction", 
    routeTemplate: "api/{controller}/{action}", 
    defaults: null 
); 

/* Default route */ 
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 
  1. 我在哪裏必須把默認這樣GET api/A將被匹配到GetAs()POST api/A將匹配PostA(A a)
  2. GET api/A/5

回答

0

嗯,這不是我實際尋找的解決方案,但它比爲每個控制器手動添加一堆路由更通用。

它基本上是爲每個控制器添加兩條路線。這些路由模板覆蓋了對api/[ControllerName]/{id}和api/[ControllerName]的請求,並將它們委託給相應的控制器操作。

foreach (Type t in GetTypesInNamespace(Assembly.GetExecutingAssembly(), "MyProject.Controllers")) { 
    if (typeof(ApiController).IsAssignableFrom(t)) { // Make sure that this controller class is deriving from api controller 
     string controllerName = t.Name.Substring(0, t.Name.LastIndexOf("Controller")); // Remove Controller postfix from name 
     config.Routes.MapHttpRoute(
      name: "ApiGet" + controllerName, 
      routeTemplate: "api/" + controllerName + "/{id}", 
      defaults: new { controller = controllerName, action = "Get" + controllerName }, 
      constraints: new { id = @"^[0-9]+$", httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
     ); 

     config.Routes.MapHttpRoute(
      name: "ApiGet" + controllerName + "s", 
      routeTemplate: "api/" + controllerName + "/{id}", 
      defaults: new { controller = controllerName, id = RouteParameter.Optional, action = "Get" + controllerName + "s" }, 
      constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
     ); 
    } 
}