Убедитесь, что HttpConfiguration.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

Ответы

Ответ 1

См. @gentiane answer ниже, чтобы узнать, как правильно справиться с этим сейчас.

В конце метода Application_Start в Global.Asax.cs попробуйте добавить: -

GlobalConfiguration.Configuration.EnsureInitialized(); 

Ответ 2

Если вы сделаете это в конце Application_Start, будет слишком поздно, так как вызывается WebApiConfig.Register.

Лучший способ разрешить это - использовать новый метод инициализации, заменив в Global.asax:

WebApiConfig.Register(GlobalConfiguration.Configuration);

по

GlobalConfiguration.Configure(WebApiConfig.Register);

Ответ 3

Я действительно получил эту ошибку, когда я использовал маршрутизацию атрибутов в своем WebApi.

У меня был

[Маршрут ( "WebAPI/siteTypes/{siteTypeId" ]

вместо

[Маршрут ( "WebAPI/siteTypes/{siteTypeId}" ]

для моего маршрута и получил эту ошибку. Я просто пропустил закрытую фигурную скобку. Как только я добавлю его обратно, эта ошибка больше не повторяется.

Ответ 4

Это старый, но является первым результатом поиска Google при поиске этой ошибки. После довольно много рытья я смог выяснить, что происходит.

TL;DR:
Все GlobalConfiguration.Configure делает это действие и вызывает EnsureInitialized(). config.MapAttributeRoutes() должен быть вызван до EnsureInitialized(), поскольку EnsureInitialized выполняется только один раз.

Значение:, если вы используете существующий проект Mvc, все, что вам нужно сделать, это:

  • Добавить GlobalConfiguration.Configuration.EnsureInitialized();в нижней части вашего метода Application_Start.

ИЛИ

  1. Переместите всю конфигурацию в один вызов 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

Ответ 5

У меня была связанная с этим проблема. Иногда вызов GlobalConfiguration.Configure несколько раз вызывает эту ошибку. В качестве обходного пути я поместил всю логику инициализации конфигурации в одном месте.

Ответ 6

Для меня проблема заключалась в том, что я пытался использовать именованные параметры для полей строки запроса в моих маршрутах:

[Route("my-route?field={field}")]
public void MyRoute([FromUri] string field)
{
}

Поля строки запроса автоматически сопоставляются с параметрами и фактически не являются частью определения маршрута. Это работает:

[Route("my-route")]
public void MyRoute([FromUri] string field)
{
}

Ответ 7

Хотя приведенный выше ответ работает, если он не установлен, в моем случае этот материал уже был установлен. Другое дело, что для одного из API, которые я написал, я префикс маршрута с помощью /. Пример

[Route("/api/abc/{client}")] 

.Установив это на

[Route("api/abc/{client}")]

исправил это для меня

Ответ 8

ЕСЛИ ЭТА ОШИБКА СЧИТАЕТ, ЧТОБЫ ПОЛУЧИЛОСЬ "НИЧЕГО", т.е. какое-то время ваше приложение работало безупречно, спросите себя: я добавил действие в контроллер или изменил какие-либо маршруты до появления этой ошибки?

Если ответ "да" (и, вероятно, так и есть), вы, вероятно, допустили ошибку в процессе. Неправильное форматирование, копирование/вставка действия и забвение о том, что имена конечных точек уникальны и т.д., Приведут вас сюда. Предположение, что эта ошибка связана с тем, как ее устранить, может привести к тому, что вы ошибетесь деревом.

Ответ 9

Вызов

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

перед

GlobalConfiguration.Configure(c => ...);

завершает свое выполнение.

Ответ 10

Я получил эту ошибку, когда версия Newtonsoft.Json была другой в моем основном проекте по сравнению с вспомогательным проектом

Ответ 11

Как правило, это исключение, когда шаблоны маршрутов в "Маршрутизация атрибутов" не являются правильными.

Например, я получил это, когда написал следующий код:

[Route("{dirName:string}/contents")] //incorrect
public HttpResponseMessage GetDirContents(string dirName) { ... }

В синтаксисе ограничений маршрута {параметр: ограничение} ограничение по умолчанию имеет тип строка. Не нужно упоминать это явно.

[Route("{dirName}/contents")] //correct
public HttpResponseMessage GetDirContents(string dirName) { ... }

Ответ 12

Я начал получать эту ошибку однажды. После того, как я изменил наше приложение, чтобы позвонить EnsureInitialized(), я смог увидеть причину.

У меня был специальный атрибут, фильтр, на действие. У этого класса атрибутов произошел сбой в пакете NuGet, в котором он живет.

Несмотря на то, что я обновил код и все его скомпилировал, локальный рабочий IIS загружал старую DLL и не обнаруживал член класса во время инициализации, считывая атрибуты при действиях и т.д.

По какой-то причине (возможно, из-за порядка/при инициализации нашего журнала) эта ошибка не была обнаружена, возможно, оставив WebAPI в странном состоянии, пока я не добавил EnsureInitialized(), который поймал исключение и всплыл.

Выполнение правильной bin и obj очистки с помощью удобного script разрешило его.

Ответ 13

В моем случае я создал веб-сервис в проекте A и запустил его из проекта B, и я получил именно эту ошибку. Проблема заключалась в том, что некоторые .dll файлы, которые требуются A и отсутствовали в папке build-output-of B. Убедитесь, что эти .dll файлы доступны, исправьте это.