2012-11-20 9 views
5

Ho un progetto MVC4 con elmah aggiunto. Application_Start di mia global.asax() haCome ignorare una rotta in configurazione MVC4 WebAPI?

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

# 1 e # 2 sono i seguenti

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

I modelli sono identici e di routing nei controllori funziona esattamente come lo vogliamo (da una specifica URI prospettiva). Il problema è che la route di ignora viene aggiunta DOPO che la route WebAPI è stata aggiunta. Quindi, quello che dovrebbe essere ignorato dal routing MVC4 e gestito da Elmah (es. /elmah.axd/styles) viene invece intercettato da WebAPI e la richiesta fallisce => quindi non ho CSS nelle mie pagine elmah.axd. Ho provato a lanciare # 1 e # 2 in global.asax ma questo ha causato il fallimento di tutti gli instradamenti WebAPI - FAR peggiore di CSS che non funziona in Elmah!

Fondamentalmente ho bisogno di un modo per indicare al routing di WebAPI di ignorare {resource}.axd/{*pathInfo} come prima via: come posso farlo?

+0

Il percorso API Web DefaultApi sembra strano: dovrebbe essere qualcosa del tipo 'routeTemplate: "api/{Controller}/{action}/{id}",' altrimenti la MVC e percorsi WebAPI entreranno in conflitto. Hai provato un controller regolare e il controller api sta funzionando per te? – nemesv

+0

Ho rimosso in modo specifico il prefisso 'api' perché ciò avrebbe rovinato i nostri URI pubblicati. Entrambi i controller MVC e WebAPI funzionano correttamente: prima vengono cercati i controllori WebAPI, quindi vengono cercati i controller MVC (poiché questo è l'ordine di impostazione della configurazione) – DeepSpace101

+1

config.Routes.IgnoreRoute ("{resource} .axd/{* pathInfo} "); nella classe WebApiConfig, metodo Register. L'hai provato? – Regfor

risposta

8

Questo è ciò che ha funzionato per noi - lo spostamento del ignorare senza il proprio involucro e come il primo.

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

sembra che funzioni perché si sta configurando la configurazione del percorso prima di registrare WebApi. Potresti entrare più nel dettaglio su cosa sta succedendo qui? – tam

2

Sembra che sia necessario un controllo più preciso dell'ordine delle definizioni di percorso. Invece di tirare questi in dalle singole classi RouteConfig e WebApiConfig, è possibile definire questi direttamente in global.asax.cs in questo modo:

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

L'avevo già provato prima di postare: 'Ho provato a lanciare # 1 e # 2 su global.asax ma questo ha causato il fallimento di tutti gli instradamenti WebAPI - FAR peggiore di quelli CSS non funzionanti in Elmah!' – DeepSpace101

+0

Ah, hai ragione! Ho aggiornato la mia risposta per risolvere questo problema. –

Problemi correlati