Переконайтесь, що HttpConfiguration.EnsureInitialized ()


142

Я встановив 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

Відповіді:


141

Дивіться відповідь @ gentiane нижче про правильний спосіб вирішити це зараз.

Наприкінці Application_Startметоду у Global.Asax.csспробі додавання: -

GlobalConfiguration.Configuration.EnsureInitialized(); 

3
Я отримав цю відповідь, тому порівняв свій проект, який був створений з попередньої версії VS 2013, та проект, який був створений з оновленням 1, і різниця полягає в тому, що вони замінили WebApiConfig.Register (...) на GlobalConfiguration.Configure (. ..) як описує гентіян у своїй відповіді. Це вирішує проблему.
Брайан Бедард

1
Саме це і GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)буде викликати після конфігурації Зворотний зв'язок.
cmxl

4
Помилка може виникнути і тоді, коли конфігурація DI виконана перед GlobalConfiguration.Configure (WebApiConfig.Register); виклик
Silvos

Дякую. Це був шип в моєму боці.
Роберт Болтон

241

Якщо ви зробите це в кінці Application_Start, це буде занадто пізно, як викликано WebApiConfig.Register.

Найкращий спосіб вирішити це - використовувати новий метод ініціалізації шляхом заміни в Global.asax:

WebApiConfig.Register(GlobalConfiguration.Configuration);

від

GlobalConfiguration.Configure(WebApiConfig.Register);

12
На основі документації Microsoft це має бути правильним способом. asp.net/web-api/overview/web-api-routing-and-action/…
Dalorzo

Я мігрував додаток mvc, коли маршрути api не працювали, додавши це, і MapHttpAttributeRoutes оживив це.
Філ Купер

1
Ця відповідь зафіксувала це для мене.
GiddyUpHorsey

Але що робити, якщо у вас нестатичний клас WebApiConfig?
Георгій Григор’єв

@GeorgyGrigoryev: ви можете просто зафіксувати це всередині дії так:GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl

69

Я фактично отримав цю помилку, коли використовував маршрутизацію атрибутів у своєму веб-архіві.

я мав

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

замість

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

для мого маршруту і отримав цю помилку. Я просто пропустив фігурну кронштейн. Після того, як я знову додав її, ця помилка не повторилася.


23
У мене також була ця проблема, коли я встановив маршрут з косою рисою [Route ("/ api /"]) замість [Route ("api")]
cguedel

1
{int: id} замість {id: int}
Marat Batalandabad

1
Цей мене постійно отримує, але раніше він давав іншу помилку. Після переходу на візуальну студію 2015 та .Net 4.6 я отримую цю помилку.
nbering

7
Моєю помилкою була [Route ("api / {параметр: string}")] замість [Route ("api / {параметр}")]. Мабуть кажучи: рядок як тип неправильний, оскільки це за замовчуванням.
Джамбі

1
Подібно до Jamby, моя помилка полягала в тому, що мені потрібно: [Route ("api / ObjectOfInterest / {type} / {name}")] ... але: [Route ("api / ObjectOfInterest / {type: string} / {name : string} ")] // WRONG ... не працює. Я знаю, що це дивно, що мені потрібен параметр з назвою "Тип", який є рядком (а не System.Type) ... але вилучив специфікацію рядка, і вона працює чудово.
Aidanapword

31

Це давнє, але це перший результат у Google при пошуку цієї помилки. Після зовсім небагато копання я зміг зрозуміти, що відбувається.

tldr:
Все, що робить GlobalConfiguration.Configure , викликає вашу дію та викликає EnsureInitialized () . config.MapAttributeRoutes () потрібно викликати перед EnsureInitialized (), оскільки EnsureInitialized виконується лише один раз.

Значення: якщо ви перебуваєте з існуючого проекту Mvc, все, що вам потрібно зробити, це:

  1. Додати GlobalConfiguration.Configuration.EnsureInitialized (); внизу вашого методу Application_Start .

АБО

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

Копати глибше

HttpConfiguration.Configuration має властивість "Initializer", визначене так:

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized () виконує цю дію і встановлює _initialized на істинне

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 врятувало мені життя. У мене виникли проблеми з маршрутизацією на основі атрибутів та конфігурацією DI разом з правильним порядком виклику конфігурацій. Я також використовую MS ApiVersioning, де мені потрібні були ін'єкції DI, зроблені до того, як перший маршрут потрапив в атрибути версії.
Дуже

12

У мене була пов’язана проблема. Іноді виклик GlobalConfiguration.Configureкілька разів запускає цю помилку. В якості вирішення я поставив всю логіку ініціалізації конфігурації в одне місце.


Так, у моєму випадку це точно було питання
Обі

Дякую! Це була саме моя проблема.
Søren Boisen

Тут же питання! Виправляли проблему протягом декількох годин, тому х для коментаря.
Sc0tTy

7

Для мене проблема полягала в тому, що я намагався використовувати названі параметри для рядків рядків запиту в своїх маршрутах:

[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}")]

виправили це для мене


@Svend Дійсно. Здавалося, що це дурне, але здається, що це питання у досить багатьох випадках. : P
The 0bserver

@ The0bserver це працювало і для мене. Це було важко діагностувати , так як у верхній частині мого класу контролера у мене був HttpPrefixдекоратор , а потім для моєї індивідуальної кінцевої точки я мав декоратор: [Route("/")]. Просто пройшовши порожній рядок у маршруті, виправлена ​​проблема.
Девід,

1
Радий, що це допомогло. :)
The 0bserver

7

ЯКЩО ЦЕ ПОМИЛКА ВИДАЄТЬСЯ ЗАРАЗ "ЗАРАЗ" , тобто ваш додаток деякий час працював ідеально, запитайте себе: чи я додав дію до контролера чи змінив будь-які маршрути до того, як побачив цю помилку?

Якщо відповідь "так" (і це, мабуть, є), ви, ймовірно, помилилися в процесі. Неправильне форматування, копіювання / вставлення дії та забуття, щоб переконатися, що імена кінцевих точок є унікальними, тощо, все закінчить вас тут. Заява, що ця помилка робить про те, як її усунути, може надіслати вам гавкання неправильного дерева.


Саме це і сталося зі мною. Я змінив маршрут, але залишив помилкову фігурну дужку на кінці так: [Маршрут ("GetStuff}")]
Стю Ціна

2

Дзвінок

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

раніше

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

завершує його виконання.


2

Я отримав цю помилку, коли версія Newtonsoft.Json в моєму головному проекті відрізнялася порівняно з проектом-помічником


Швидке доповнення: переконайтесь, що очистите своє рішення після виправлення проблеми із посиланням та двічі перевірте, чи є остаточна розгорнута DLL правильна версія :)
Marcel

1

Зазвичай це виняток, коли шаблони маршрутів у "Маршрутизації атрибутів" не є належними.

Наприклад, я отримав це, коли написав наступний код:

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

У синтаксисі обмежень маршруту {параметр: обмеження} обмеження за замовчуванням є рядком типу . Не потрібно це прямо згадувати.

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

0

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

У мене був власний атрибут, фільтр. Цей клас атрибутів змінився в пакеті NuGet, в якому він живе.

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

З якоїсь причини (можливо, через замовлення / коли ініціалізація нашого журналу) цю помилку не можна було виявити, можливо, залишивши WebAPI у дивному стані, доки я не додав, EnsureInitialized()який виявив виняток, і з’явився на світ.

Виконання правильного binта objчистого за допомогою зручного сценарію вирішило це.


0

У моєму випадку я створив веб-сервіс у проекті A і запустив його з Project B, і я отримав саме цю помилку. Проблема полягала в тому, що деякі .dll-файли, яких вимагає A, де відсутні у папці збирання-виводу B. Переконайтеся, що ці .dll-файли доступні, виправили це.


0

У моєму випадку я використовував Entity як параметр моєї дії, що його "Schema" відсутня.

Неправильний атрибут:

[Table("Table name", Schema = "")]

Правильно:

[Table("Table name", Schema = "schema name")]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.