Ответ 1
См. @gentiane answer ниже, чтобы узнать, как правильно справиться с этим сейчас.
В конце метода Application_Start
в Global.Asax.cs
попробуйте добавить: -
GlobalConfiguration.Configuration.EnsureInitialized();
Я установил Visual Studio 2013, и когда я запустил приложение, я получил ошибку ниже.
Я не знаю, где я должен инициализировать этот объект.
Что делать?
Server Error in '/' Application.
The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application startup code after all other initialization code.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application startup code after all other initialization code.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[InvalidOperationException: The object has not yet been initialized. Ensure that HttpConfiguration.EnsureInitialized() is called in the application startup code after all other initialization code.]
System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() +101
System.Web.Http.Routing.RouteCollectionRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) +63
System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase httpContext) +107
System.Web.Routing.RouteCollection.GetRouteData(HttpContextBase httpContext) +233
System.Web.Routing.UrlRoutingModule.PostResolveRequestCache(HttpContextBase context) +60
System.Web.Routing.UrlRoutingModule.OnApplicationPostResolveRequestCache(Object sender, EventArgs e) +82
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18408
Это для AlumCloud
См. @gentiane answer ниже, чтобы узнать, как правильно справиться с этим сейчас.
В конце метода Application_Start
в Global.Asax.cs
попробуйте добавить: -
GlobalConfiguration.Configuration.EnsureInitialized();
Если вы сделаете это в конце Application_Start, будет слишком поздно, так как вызывается WebApiConfig.Register.
Лучший способ разрешить это - использовать новый метод инициализации, заменив в Global.asax:
WebApiConfig.Register(GlobalConfiguration.Configuration);
по
GlobalConfiguration.Configure(WebApiConfig.Register);
Я действительно получил эту ошибку, когда я использовал маршрутизацию атрибутов в своем WebApi.
У меня был
[Маршрут ( "WebAPI/siteTypes/{siteTypeId" ]
вместо
[Маршрут ( "WebAPI/siteTypes/{siteTypeId}" ]
для моего маршрута и получил эту ошибку. Я просто пропустил закрытую фигурную скобку. Как только я добавлю его обратно, эта ошибка больше не повторяется.
Это старый, но является первым результатом поиска Google при поиске этой ошибки. После довольно много рытья я смог выяснить, что происходит.
TL;DR:
Все GlobalConfiguration.Configure делает это действие и вызывает EnsureInitialized(). config.MapAttributeRoutes() должен быть вызван до EnsureInitialized(), поскольку EnsureInitialized выполняется только один раз.
Значение:, если вы используете существующий проект Mvc, все, что вам нужно сделать, это:
- Добавить GlobalConfiguration.Configuration.EnsureInitialized();в нижней части вашего метода Application_Start.
- Переместите всю конфигурацию в один вызов GlobalConfiguration.Configure:
GlobalConfiguration.Configure(config =>
{
WebApiConfig.Register(config);
config.MapAttributeRoutes();
...
});
HttpConfiguration.Configuration имеет свойство "Инициализатор", определенное следующим образом:
public Action<HttpConfiguration> Initializer;
HttpConfiguration.EnsureInitialized() запускает это действие и устанавливает _initialized значение true
public void EnsureInitialized()
{
if (_initialized)
{
return;
}
_initialized = true;
Initializer(this);
}
HttpConfiguration.MapAttributeRoutes вызывает внутренний метод AttributeRoutingMapper.MapAttributeRoutes, который устанавливает HttpConfiguration.Initializer
public static void MapAttributeRoutes(...)
{
RouteCollectionRoute aggregateRoute = new RouteCollectionRoute();
configuration.Routes.Add(AttributeRouteName, aggregateRoute);
...
Action<HttpConfiguration> previousInitializer = configuration.Initializer;
configuration.Initializer = config =>
{
previousInitializer(config);
...
};
}
GlobalConfiguration.Configure запускает EnsureInitialized сразу после вызова вашего действия:
public static void Configure(Action<HttpConfiguration> configurationCallback)
{
if (configurationCallback == null)
{
throw new ArgumentNullException("configurationCallback");
}
configurationCallback.Invoke(Configuration);
Configuration.EnsureInitialized();
}
Не забывайте, что если вы заходите к стене, источник для asp.net доступен в http://aspnetwebstack.codeplex.com/SourceControl/latest
У меня была связанная с этим проблема. Иногда вызов GlobalConfiguration.Configure
несколько раз вызывает эту ошибку. В качестве обходного пути я поместил всю логику инициализации конфигурации в одном месте.
Для меня проблема заключалась в том, что я пытался использовать именованные параметры для полей строки запроса в моих маршрутах:
[Route("my-route?field={field}")]
public void MyRoute([FromUri] string field)
{
}
Поля строки запроса автоматически сопоставляются с параметрами и фактически не являются частью определения маршрута. Это работает:
[Route("my-route")]
public void MyRoute([FromUri] string field)
{
}
Хотя приведенный выше ответ работает, если он не установлен, в моем случае этот материал уже был установлен. Другое дело, что для одного из API, которые я написал, я префикс маршрута с помощью /. Пример
[Route("/api/abc/{client}")]
.Установив это на
[Route("api/abc/{client}")]
исправил это для меня
ЕСЛИ ЭТА ОШИБКА СЧИТАЕТ, ЧТОБЫ ПОЛУЧИЛОСЬ "НИЧЕГО", т.е. какое-то время ваше приложение работало безупречно, спросите себя: я добавил действие в контроллер или изменил какие-либо маршруты до появления этой ошибки?
Если ответ "да" (и, вероятно, так и есть), вы, вероятно, допустили ошибку в процессе. Неправильное форматирование, копирование/вставка действия и забвение о том, что имена конечных точек уникальны и т.д., Приведут вас сюда. Предположение, что эта ошибка связана с тем, как ее устранить, может привести к тому, что вы ошибетесь деревом.
Вызов
GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
перед
GlobalConfiguration.Configure(c => ...);
завершает свое выполнение.
Я получил эту ошибку, когда версия Newtonsoft.Json была другой в моем основном проекте по сравнению с вспомогательным проектом
Как правило, это исключение, когда шаблоны маршрутов в "Маршрутизация атрибутов" не являются правильными.
Например, я получил это, когда написал следующий код:
[Route("{dirName:string}/contents")] //incorrect
public HttpResponseMessage GetDirContents(string dirName) { ... }
В синтаксисе ограничений маршрута {параметр: ограничение} ограничение по умолчанию имеет тип строка. Не нужно упоминать это явно.
[Route("{dirName}/contents")] //correct
public HttpResponseMessage GetDirContents(string dirName) { ... }
Я начал получать эту ошибку однажды. После того, как я изменил наше приложение, чтобы позвонить EnsureInitialized()
, я смог увидеть причину.
У меня был специальный атрибут, фильтр, на действие. У этого класса атрибутов произошел сбой в пакете NuGet, в котором он живет.
Несмотря на то, что я обновил код и все его скомпилировал, локальный рабочий IIS загружал старую DLL и не обнаруживал член класса во время инициализации, считывая атрибуты при действиях и т.д.
По какой-то причине (возможно, из-за порядка/при инициализации нашего журнала) эта ошибка не была обнаружена, возможно, оставив WebAPI в странном состоянии, пока я не добавил EnsureInitialized()
, который поймал исключение и всплыл.
Выполнение правильной bin
и obj
очистки с помощью удобного script разрешило его.
В моем случае я создал веб-сервис в проекте A и запустил его из проекта B, и я получил именно эту ошибку. Проблема заключалась в том, что некоторые .dll файлы, которые требуются A и отсутствовали в папке build-output-of B. Убедитесь, что эти .dll файлы доступны, исправьте это.