2015-11-05 96 views
6

我有一個自定義路由處理程序女巫我想在不同的控制器上使用。現在,我讓我的控制器使用該路由處理的唯一方法是將其設置這樣使用路由屬性時設置web api路由處理程序

RouteTable.Routes.MapHttpRoute(
    name: "CustomRouteHandler", 
    routeTemplate: "/custom/{controller}/{action}", 
    defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional } 
    ).RouteHandler = new CustomRouteHandler(); 

我真的想用路由屬性這樣

[HttpGet] 
[Route(Name = "GetCart")] 
public Cart Get() 
{ 
    return _repository.Get(); 
} 

但是,當我使用路由屬性,似乎無法弄清楚如何確保我使用自定義路由處理程序。最好我只使用路由屬性,所以如果我可以使用像「RouteHandler」這樣的屬性,並在這裏指向我的「CustomRouteHandler」,這將是完美的。

是否有我可以使用這樣的屬性,或者我可以以某種方式將MapHttpRoute中的所有內容都指向「/ Custom」,然後使用此處的路由屬性並使所有控制器都具有自定義處理程序?

另一種選擇也許可以使我自己的屬性,以使控制器或方法來使用我的自定義路由處理程序?

我試圖讓開發者看到這個控制器或方法使用自定義路由處理程序,如果新開發人員應該添加另一個控制器,他們可以使用像「/ custom」這樣的特殊路由,或使用屬性。

任何想法都非常受歡迎。 謝謝。

+0

在RouteConfig文件中,驗證您是否設置了'routes.MapMvcAttributeRoutes();'。 –

+0

我通過「config.MapHttpAttributeRoutes();」 - 路線工作,這不是問題。 – MacGyver

回答

0

不幸的是,這不是純粹的AttributeRouting可能由於一些限制:

當心!由於與Web API虛擬主機提供商架構的整合問題, 以下功能將無法正常工作:

性能增強時匹配的路由,自定義路由處理程序, 查詢參數的限制,子域路由,本地化 應用於呼入/呼出的網址,並將其縮小,將前綴 等附加到生成的路由。這些功能都必須等待網頁API的 的vNext。

所以你只有三個選項。

1)以經典的方式讓路由在WebApiConfig.cs

config.Routes.MapHttpRoute(
    name: "GetData", 
    routeTemplate: "api/yourawesomecontroller/data", 
    defaults: new { controller = "YourAwesomeController", action = nameof(YourAwesomeController.GetData) }, 
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }, 
    handler: new YourCustomMessageHandler() { InnerHandler = new HttpControllerDispatcher(config) } 
); 

2)您也可以註冊YourCustomMessageHandler所有請求,並實現內部處理程序本身路由過濾:

class YourCustomMessageHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request.Method == HttpMethod.Get && 
      request.RequestUri.PathAndQuery.StartsWith("/api/yourawesomecontroller/data")) 

     // ... custom handling for request ... 

     var response = await base.SendAsync(request, cancellationToken); 

     // ... custom handling for response ... 

     return response; 
    } 
} 

3)最後選項是自定義路線屬性:

public class MyRouteAttribute : Attribute 
{ 
    public string Url { get; private set; } 

    public MyRouteAttribute (string url) 
    { 
     Url = url; 
    } 
} 

你需要用裝飾動作方法。但在這種情況下,你需要在選項1在自定義引導程序註冊路線等)是這樣的:

foreach (var controllerType in allControllerTypes) 
{ 
    var attributes = System.ComponentModel.TypeDescriptor.GetAttributes(controllerType); 
    var urlAttribute = (MyRouteAttribute) attributes[typeof(MyRouteAttribute)]; 
    var controllerName = controllerType.Name.Replace("Controller", ""); 

    config.Routes.MapHttpRoute(
     name: controllerName, 
     routeTemplate: urlAttribute.Url, 
     handler: new YourCustomMessageHandler() { InnerHandler = new HttpControllerDispatcher(config) } 
    ); 
} 

請注意,你必須以明確指定的YourCustomMessageHandlerInnerHandler傳遞請求到管道等處理程序和控制器。詳情請參閱Microsoft explanation