tutorial por for example ejemplo autenticacion asp asp.net-mvc asp.net-web-api

asp.net-mvc - por - web api ejemplo



Rutas de atributos de la API web en la excepción MVC 5: el objeto aún no se ha inicializado. Asegúrese de que HttpConfiguration.EnsureInitialized() (3)

En un MVC 5 con API web tengo lo siguiente, usando solo rutas de atributo:

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

En el RouteTable se crearon todas las rutas MVC ... Pero no las API ...

Revisé el RouteTable.Routes y veo una excepción:

El objeto aún no se ha inicializado. Asegúrese de llamar a HttpConfiguration.EnsureInitialized () en el código de inicio de la aplicación después de todos los demás códigos de inicialización.

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

Para probar esto, agregué solo dos acciones de API web para el proyecto:

[RoutePrefix("api")] public class StatApiController : ApiController { [Route("stats/notescreateddaily"), HttpGet] public IHttpActionResult NotesCreatedDaily() { // Some code } [Route("stats/userscreateddaily"), HttpGet] public IHttpActionResult UsersCreatedDaily() { // Some code } }

¿Me estoy perdiendo de algo?

Gracias, Miguel


Estoy teniendo el mismo problema después de actualizar todo mi proyecto de servicios web utilizando ASP.Net Web API 4.0 a 4.5 y el uso de Web API 2.2 con la biblioteca Cors. Logré resolver el problema con éxito. Lo que hice fue eliminar o comentar la siguiente declaración en el archivo RouteConfig.cs en la carpeta 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 } ); } } }

En mi archivo Global.asax.cs estoy usando el registro de enrutamiento anterior

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

Este es el motivo: Enrutamiento de atributos en Web API 2

Nota: Migrando desde la API web 1

Antes de Web API 2, las plantillas de proyectos de la API Web generaban un código como este:

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

Si el enrutamiento de atributos está habilitado, este código generará una excepción. Si actualiza un proyecto de API web existente para usar el enrutamiento de atributos, asegúrese de actualizar este código de configuración a lo siguiente:

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

Estoy usando la ruta anterior y decidí no usar el enrutamiento de atributos. Así que saca esa declaración


La solución de hecho está reemplazando:

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

Por:

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

Eso fue un cambio en la API web 2.


La solución es llamar a GlobalConfiguration.Configuration.EnsureInitialized(); una vez que haya finalizado toda su configuración relacionada con la API web, pero tengo curiosidad por saber por qué sus registros se ven así ... ¿Qué tipo de plantilla de proyecto usó para crear el proyecto MVC5? ... Las plantillas predefinidas que vienen con Visual Studio tiene una estructura que ayuda a minimizar los problemas de orden de ruta y, por lo tanto, recomendaría su uso, por lo que se pregunta por qué su estructura de configuración se ve así ...