2013-05-31 12 views
6

Prima di tutto ho letto tutti gli articoli che riesco a trovare su questo argomento e ho installato diversi plugin "route debug". Ho più familiarità con Java/Spring quindi non ho idea di come eseguire il debug di questa cosa, utilizzando vs 2012. (Non riesco comunque a fare in modo che IISExpress stampi qualsiasi debug molto meno il tipo di output di debug a cui sono abituato con Spring/Tomcat .)Ancora un'altra route WebAPI ASP.Net non trovata

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 = "Legal", 
      action = "Index", 
      id = UrlParameter.Optional } 
    ); 
    } 
} 

Ora, sono in grado di premere la pagina Indice tramite il controller predefinito. Comunque, sto cercando di colpire l'URL/WebAPI/Metadati/in base alla seguente controller:

[BreezeController] 
public class WebApiController : ApiController { 
    private readonly EFContextProvider<BankruptcyDbContext> _contextProvider = 
    new EFContextProvider<BankruptcyDbContext>(); 

    [HttpGet] 
    public string Metadata() { 
    return _contextProvider.Metadata(); 
    } 
} 

La "Strada Debugger" dice che le mie richieste per/WebAPI/metadati,/WebAPI/Metadati /,/WebAPI/Metadati/0, e più dovrebbe "match", ma tutto quello che ottiene è 404.

Edit1: ho finalmente trovato i registri di traccia e ottenuto un po 'più in dettaglio:

The controller for path &amp;#39;/WebApi/Metadata&amp;#39; was not found or does not implement IController 

risposta

5

Assicurarsi che si sta utilizzando la versione più recente corrente di Visual Studio 2012 con Update 2 ecc .. Non si deve solo avere un RouteConfig.cs file in App_Start, ma c'è anche un WebApiConfig cs file di

Così, mentre itinerari normali MVC utilizzano la classe RouteConfig

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

l'API Web utilizza l'Noi bApiConfig, che è spense con il fuori il codice della casella suggerito sopra nella WebApiConfig classe statica:

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

si avrebbe bisogno di registrare le rotte utilizzando l'estensione MapHttpRoute per le rotte basate su ApiController. Esempio:

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

BTW, cos'è BreezeController e perché è decorato su WebApiController?

+0

http://www.breezejs.com/ –

+0

impressionante, che ha funzionato! Non sapevo che ci fosse un diverso tra mapRoute e MapHttpRoute. –

+3

@BrockNoland Benvenuti nel mondo confuso di ASP.NET Web API vs ASP.NET MVC. Due framework completamente diversi, confezionati insieme e fatti sembrare estremamente simili "per facilitare la curva di apprendimento". –

Problemi correlati