2013-11-09 6 views
6

Su un MVC 5 con API Web Ho il seguente, utilizzando solo Attributo Rotte:Attributi dell'API Web Rotte nell'eccezione MVC 5: l'oggetto non è stato ancora inizializzato. Assicurarsi che HttpConfiguration.EnsureInitialized()

RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
RouteTable.Routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.([iI][cC][oO]|[gG][iI][fF])(/.*)?" }); // TODO: Check for Apple Icons 

RouteTable.Routes.MapMvcAttributeRoutes(); 
GlobalConfiguration.Configuration.MapHttpAttributeRoutes(); 
AreaRegistration.RegisterAllAreas(); 

Nel RouteTable tutti i percorsi MVC sono stati creati ... ma non quelle API ...

ho controllato i RouteTable.Routes e vedo un'eccezione:

L'oggetto non è ancora stato inizializzato. Assicurarsi che HttpConfiguration.EnsureInitialized() venga chiamato nel codice di avvio dell'applicazione dopo tutti gli altri codici di inizializzazione.

a System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() in System.Web.Http.Routing.RouteCollectionRoute.GetEnumerator() a System.Linq.SystemCore_EnumerableDebugView`1.get_Items()

Per testare questo ho aggiunto solo due azioni Web API per il progetto:

[RoutePrefix("api")] 
public class StatApiController : ApiController { 

    [Route("stats/notescreateddaily"), HttpGet] 
    public IHttpActionResult NotesCreatedDaily() { 
    // Some code 
    } 

    [Route("stats/userscreateddaily"), HttpGet] 
    public IHttpActionResult UsersCreatedDaily() { 
    // Some code 
    } 

} 

mi sto perdendo qualcosa?

Grazie, Miguel

risposta

1

La soluzione è quella di chiamare GlobalConfiguration.Configuration.EnsureInitialized(); dopo tutto il vostro API Web di configurazione relative è fatto, ma sono curioso di sapere il motivo per cui le registrazioni simile a questa ... Che tipo di modello di progetto ha fatto si usa per creare il progetto MVC5? ... I modelli predefiniti forniti con Visual Studio hanno una struttura che aiuta a minimizzare i problemi di ordinamento delle rotte e quindi raccomanderemmo di usarli, quindi chiedetevi perché la vostra struttura di configurazione è così ...

+0

In realtà il problema era in un cambiamento in Web API 2. Ho appena postato la risposta ... Non sto usando i modelli perché ho un bootstrap di progetto che uso come base ... –

15

La soluzione sta infatti sostituendo:

GlobalConfiguration.Configuration.MapHttpAttributeRoutes(); 

By:

GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes()); 

Questo è stato un cambiamento nelle API Web 2.

+1

Avete altre registrazioni API Web (ad esempio, la registrazione di formattatori personalizzati, tracciabilità, ecc.). in caso affermativo, assicurati che avvengano all'interno della lambda che stai usando..questo è perché 'GlobalConfiguration.Configure' chiamerebbe internamente' CleanInitialized' su GlobalConfiguration e vedresti risultati inattesi se ti registri dopo la chiamata a 'GlobalConfiguration.Configure ' –

+0

Grazie mille. Così utile! –

+0

@Miguel Ancora utile! Si prega di contrassegnare questo come la risposta accettata, quindi è più facile da trovare. – jpaugh

1

Sto avendo lo stesso problema dopo l'aggiornamento tutto il mio progetto ai servizi Web utilizzando API Web 4.0 ASP.Net a 4,5 e utilizzando Web API 2.2 con la libreria Cors. Sono riuscito a risolvere il problema con successo. Quello che ho fatto è stato eliminare o commentando la seguente dichiarazione in occasione del file RouteConfig.cs alla cartella App_Start: `

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Http; 

namespace myNameSpace.Configurations 
{ 
    public static class RouteConfig 
    { 

     public static void Register(HttpConfiguration config) 
     { 
      // Web API routes 
      //DON'T USE THIS. IT WILL GIVE PROBLEMS IN INSTANTIATION OF OBJECTS 
      //config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "LocationData", 
       routeTemplate: "dataservices/locations/{controller}/{action}/{id}", 
       defaults: new {action = "Index", id = RouteParameter.Optional } 
      ); 


      config.Routes.MapHttpRoute(
       name: "ProfileData", 
       routeTemplate: "dataservices/profiles/{controller}/{action}/{id}", 
       defaults: new { action = "Index", id = RouteParameter.Optional } 
      ); 



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

    } 
} 

Sul mio Global.asax.cs presentare Sto usando il vecchio registrazione di routing

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Http; 
using System.Web.Mvc; 
using System.Web.Optimization; 
using System.Web.Routing; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Converters; 
using System.Net.Http.Formatting; 

using myNameSpace.IoC; 
using myNameSpace.Configurations; // Here actually I change the protected void Application_Start() to protected void Configuration() and change the folder to configuration instead on App_Start 
using myNameSpace.Controllers.ExceptionSchema; 
using myNameSpace.Filters.HttpFilters; 

namespace myNameSpace 
{ 
    public class WebApiApplication : System.Web.HttpApplication 
    { 
     public static void RegisterApis(HttpConfiguration config) 
     { 
      config.Filters.Add(new CustomHttpExceptionFilter()); 
     } 
     protected void Application_Start() 
     { 
      //AreaRegistration.RegisterAllAreas(); 
      RegisterApis(GlobalConfiguration.Configuration); 


      var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
      json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; 
      GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 


      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.Register(GlobalConfiguration.Configuration); 
     } 
    } 
} 

Ecco il motivo: Attribute Routing in Web API 2

Nota: Migrazione da API Web 1

Prima di API Web 2, il Web API pro modelli ject ha generato codice come questo:

protected void Application_Start() 
{ 
    // WARNING - Not compatible with attribute routing. 
    WebApiConfig.Register(GlobalConfiguration.Configuration); 
} 

Se il routing degli attributi è abilitato, questo codice genererà un'eccezione.Se si aggiorna un progetto Web API esistente per utilizzare l'attributo di routing, assicuratevi di aggiornare questo codice di configurazione al seguente:

protected void Application_Start() 
{ 
    // Pass a delegate to the Configure method. 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
} 

Sto usando il vecchio percorso e ho deciso di non utilizzare l'attributo di routing. Quindi prendi QUESTA affermazione

Problemi correlati