2012-11-20 19 views
5

Mam projekt MVC4 z elmah dodaje. Mojego global.asax za Application_Start() maJak zignorować trasę w konfiguracji WebAPI MVC4?

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

# 1 i # 2 są następujące

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 } 
     ); 
    } 
} 

Szablony są identyczne i routing do kontrolerów działa dokładnie tak, jak tego chcemy (od spec URI perspektywiczny). Problem polega na tym, że trasa ignorowania jest dodawana PO dodaniu trasy WebAPI. To, co powinno być zignorowane przez routing MVC4s i obsługiwane przez Elmah (np. /elmah.axd/styles) jest zamiast tego przechwytywane przez WebAPI, a żądanie kończy się niepowodzeniem =>, więc nie mam żadnych CSS na stronach elmah.axd. Próbowałem przerzucić # 1 i # 2 w global.asax, ale to spowodowało awarię wszystkich routingu WebAPI - FAR gorszy niż CSS nie działający w Elmah!

Po prostu potrzebuję jakiegoś sposobu, aby polecić routing WebAPI, aby zignorować {resource}.axd/{*pathInfo} prawo jako pierwszą trasę - jak mogę to zrobić?

+0

Trasa Web API DefaultApi wygląda dziwnie: powinno być coś takiego jak 'routeTemplate: "api/{kontroler}/{działania}/{id}",' inaczej MVC i trasy WebAPI będzie kolidować. Czy przetestowałeś regularny kontroler i kontroler api działa dla Ciebie? – nemesv

+0

Usunąłem prefiks 'api', ponieważ mogłoby to zepsuć nasze opublikowane URI. Zarówno kontrolery MVC, jak i WebAPI działają poprawnie - najpierw kontrolery WebAPI są przeszukiwane, następnie przeszukiwane są kontrolery MVC (ponieważ jest to kolejność ustawiania przeze mnie konfiguracji) – DeepSpace101

+1

config.Routes.IgnoreRoute ("{zasób} .axd/{* pathInfo} "); w klasie WebApiConfig, metoda Register. Próbowałeś tego? – Regfor

Odpowiedz

8

To co pracował dla nas - przesuwając ignorować z owijki i jak pierwszy.

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

wygląda na to, że działa, ponieważ konfigurujesz trasę przed rejestracją WebApi. Czy mógłbyś bardziej szczegółowo opisać, co tu się dzieje? – tam

2

Wygląda na to, że potrzebujesz dokładniejszej kontroli kolejności definicji tras. Zamiast ciągnąc nich z poszczególnych klas RouteConfig i WebApiConfig, można określić je bezpośrednio w Global.asax.cs tak:

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

Próbowałem już tego przed opublikowaniem: 'Próbowałem przerzucać # 1 i # 2 w global.asax, ale to spowodowało awarię wszystkich routingu WebAPI - FAR gorszy niż CSS nie działający w Elmah!' – DeepSpace101

+0

Ach, masz rację! Zaktualizowałem swoją odpowiedź, aby rozwiązać ten problem. –