2012-11-20 11 views
5

Elmah ekledim bir MVC4 projem var. Benim Global.asax en Application_Start()MVC4 WebAPI yapılandırmasında bir rota nasıl göz ardı edilir?

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

1. sahiptir ve

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

şablonları aynıdır ve denetleyicileri içine yönlendirme bir URI spec biz (bunu istiyorum tam olarak çalışır aşağıdaki gibidir 2. olan perspektif). Sorun, WebAPI yolunun eklendikten sonra göz ardı yolunun eklenmesidir. Yani ElmaH'nin yönlendirme ve elleçlemesi MVC4s tarafından göz ardı edilmemelidir (örneğin /elmah.axd/styles) bunun yerine WebAPI tarafından engellenir ve istek başarısız olur => bu yüzden benim elmah.axd sayfalarında CSS yok. Global.asax içinde # 1 ve # 2 saygısız denedim ama bu tüm WebAPI yönlendirme başarısız olmasına neden oldu - FAR Elmah içinde çalışmıyor CSS daha kötü!

WebAPI'nin yönlendirmesini, ilk yol olarak {resource}.axd/{*pathInfo} görmezden gelmeye yönlendirmek için bir yol bulmaya ihtiyacım var - bunu nasıl yapabilirim?

+0

Web API DefaultApi rota tuhaf görünüyor: 'aksi MVC ve WebAPI yolları çakışarak "API/{controller}/{eylem}/{id}",: o' routeTemplate gibi bir şey olmalıdır. Düzenli denetleyiciyi test ettiniz ve api kontrol cihazı sizin için çalışıyor mu? – nemesv

+0

Özel olarak "api" önekini kaldırdım çünkü bu yayınlanmış URI'leri bozdu. Hem MVC hem de WebAPI denetleyicileri iyi çalışır - önce WebAPI denetleyicileri aranır, daha sonra MVC denetleyicileri aranır (çünkü bu benim yapılandırmamın sırasıdır) – DeepSpace101

+1

config.Routes.IgnoreRoute ("{resource} .axd/{* pathInfo} "); WebApiConfig sınıfında, yöntem Kayıt. Bunu denediniz mi? – Regfor

cevap

8

Bu bizim için çalıştı budur - sargının dışında gibi görmezden hareketli ilki.

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

Bu, WebApi'yi Kaydetmeden önce yol yapılandırmasını ayarladığınızdan dolayı çalışır gibi görünüyor. Burada neler olup bittiğine dair daha fazla ayrıntıya girer misin? – tam

2

Güzergah tanımlarının sırasına göre daha iyi bir kontrole ihtiyacınız olduğu gibi geliyor. Bunun yerine bireysel RouteConfig ve WebApiConfig sınıflardan bu çekmektense, bunu böyle global.asax.cs doğrudan bu tanımlayabiliriz:

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

Daha önce bunu göndermeden önce denedim: 'global.asax'da # 1 ve # 2 saygısını denedim ama bu tüm WebAPI yönlendirme işleminin başarısız olmasına neden oldu - FAR, ElmaH'de çalışmayan CSS'den daha kötü!' – DeepSpace101

+0

Ah, haklısın! Bu sorunu çözmek için cevabımı güncelledim. –