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

12 123

12 ответов:

посмотреть @gentiane ниже правильный способ справиться с этим сейчас.

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

GlobalConfiguration.Configuration.EnsureInitialized(); 

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

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

WebApiConfig.Register(GlobalConfiguration.Configuration);

by

GlobalConfiguration.Configure(WebApiConfig.Register);

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

Я

[маршрут ("webapi / siteTypes / {siteTypeId"]

вместо

[маршрут ("webapi / siteTypes / {siteTypeId}"]

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

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

tldr:
Все GlobalConfiguration.Настроить это вызывает ваше действие и вызов EnsureInitialized(). config.MapAttributeRoutes () должен быть вызван перед EnsureInitialized() так как EnsureInitialized работает только однажды.

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

  1. добавить GlobalConfiguration.Конфигурация.EnsureInitialized(); на дно вашего событий Application_Start метод.

или

  1. переместите всю конфигурацию в один вызов GlobalConfiguration.Настроить:
GlobalConfiguration.Configure(config => 
{
    WebApiConfig.Register(config);
    config.MapAttributeRoutes();
    ...
});

Глубже

HttpConfiguration.Конфигурация имеет свойство "инициализатор", определенное следующим образом:

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized() запускает это действие и устанавливает _initialized до правда

public void EnsureInitialized()
{ 
    if (_initialized)
    {
        return;
    }
    _initialized = true;
    Initializer(this);            
}

HttpConfiguration.MapAttributeRoutes вызовы внутренний метод AttributeRoutingMapper.MapAttributeRoutes, который устанавливает HttpConfiguration.Инициализатор

public static void MapAttributeRoutes(...)
{
    RouteCollectionRoute aggregateRoute = new RouteCollectionRoute();
    configuration.Routes.Add(AttributeRouteName, aggregateRoute);

    ...

    Action<HttpConfiguration> previousInitializer = configuration.Initializer;
    configuration.Initializer = config =>
    {
        previousInitializer(config);
        ...
    };
}

GlobalConfiguration.Настроить работает 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 я поставил перед маршрутом префикс a / . Пример

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

.Изменение этого на

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

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

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

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

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

вызов

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

до

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

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

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

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

[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 очистить с помощью удобного скрипта разрешил его.