2012-11-20 25 views
5

Tôi có một dự án MVC4 với elmah được thêm vào. Application_Start global.asax của tôi() cóLàm thế nào để bỏ qua một tuyến đường trong cấu hình MVAP4 WebAPI?

WebApiConfig.Register(GlobalConfiguration.Configuration); // #1 
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
RouteConfig.RegisterRoutes(RouteTable.Routes); // #2 

# 1 và # 2 như sau

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional }); 
    } 
    ... 
} 

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

Các mẫu giống hệt nhau và định tuyến vào bộ điều khiển hoạt động chính xác như chúng ta muốn nó (từ một spec URI phối cảnh). Vấn đề là tuyến đường bỏ qua được thêm vào SAU KHI tuyến đường WebAPI được thêm vào. Vì vậy, những gì nên được bỏ qua bởi MVC4s định tuyến và xử lý bởi Elmah (ví dụ như /elmah.axd/styles) là thay vì bị chặn bởi WebAPI và yêu cầu thất bại => vì vậy tôi không có CSS ​​trong các trang elmah.axd của tôi. Tôi đã thử lật # 1 và # 2 trong global.asax nhưng điều đó gây ra tất cả các định tuyến WebAPI thất bại - FAR tồi tệ hơn CSS không làm việc trong Elmah!

Tôi về cơ bản cần một số cách để hướng dẫn định tuyến của WebAPI bỏ qua {resource}.axd/{*pathInfo} ngay làm tuyến đường đầu tiên - làm cách nào tôi có thể làm điều đó?

+0

api web của bạn Mặc định, tuyến đường MVC và WebAPI sẽ xung đột nhau. Bạn đã kiểm tra bộ điều khiển thông thường và bộ điều khiển api đang làm việc cho bạn chưa? – nemesv

+0

Tôi đã xóa cụ thể tiền tố 'api' vì điều đó sẽ làm hỏng các URI đã xuất bản của chúng tôi. Cả hai bộ điều khiển MVC và WebAPI đều hoạt động tốt - đầu tiên các bộ điều khiển WebAPI được tìm kiếm, sau đó các bộ điều khiển MVC được tìm kiếm (vì đó là thứ tự của tôi thiết lập cấu hình) – DeepSpace101

+1

config.Routes.IgnoreRoute ("{resource} .axd/{* pathInfo} "); trong lớp WebApiConfig, phương thức Đăng ký. Bạn đã thử chưa? – Regfor

Trả lời

8

Đây là những gì làm việc cho chúng tôi - di chuyển lờ đi ra khỏi wrapper và như cái đầu tiên.

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     //ignore route first 
     RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     // And taken out of the call below 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 
+0

điều này có vẻ như nó hoạt động do thực tế bạn đang thiết lập cấu hình tuyến đường trước khi đăng ký WebApi. Bạn có thể đi vào chi tiết hơn về những gì đang xảy ra ở đây không? – tam

2

Có vẻ như bạn cần kiểm soát tốt hơn thứ tự của các định nghĩa tuyến đường. Thay vì kéo những từ lớp RouteConfig và WebApiConfig riêng lẻ, bạn có thể xác định những trực tiếp trong global.asax.cs như vậy:

RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "{controller}/{action}/{id}", 
    defaults: new {id = RouteParameter.Optional}); 

RouteTable.Routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 
+1

Tôi đã thử trước khi đăng: 'Tôi đã thử lật # 1 và # 2 trong global.asax nhưng điều đó đã khiến cho tất cả định tuyến WebAPI thất bại - FAR tệ hơn CSS không hoạt động trong Elmah! ' – DeepSpace101

+0

Ah, bạn nói đúng! Tôi đã cập nhật câu trả lời của mình để khắc phục sự cố này. –

Các vấn đề liên quan