web-dev-qa-db-ja.com

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

これを今すぐ処理する正しい方法については、@ gentianeの答えを以下 を参照してください。

Application_StartGlobal.Asax.csメソッドの最後に、以下を追加してください:-

GlobalConfiguration.Configuration.EnsureInitialized(); 
135
Ian Mercer

Application_Startの最後に行うと、WebApiConfig.Registerが呼び出されたため、手遅れになります。

これを解決する最善の方法は、Global.asaxを置き換えることで新しい初期化メソッドを使用することです。

WebApiConfig.Register(GlobalConfiguration.Configuration);

によって

GlobalConfiguration.Configure(WebApiConfig.Register);
226
gentiane

WebApiで属性ルーティングを使用しているときに、実際にこのエラーが発生しました。

持っていた

[Route( "webapi/siteTypes/{siteTypeId"]

の代わりに

[Route( "webapi/siteTypes/{siteTypeId}"]

私のルートのために、このエラーが発生しました。閉じ中括弧を単に見落としていました。再度追加すると、このエラーは再び発生しませんでした。

65
Jeff Yates

これは古いですが、このエラーを検索するときのGoogleでの最初の結果です。かなり掘り下げた後、私は何が起こっているのかを理解することができました。

tldr:
すべてGlobalConfiguration.Configureは、アクションを呼び出してEnsureInitialized()を呼び出します。 config.MapAttributeRoutes()を事前に呼び出す必要がありますEnsureInitialized() EnsureInitializedは1回しか実行されないためです。

意味:既存のMvcプロジェクトから来ている場合、あなたがしなければならないことはすべて:

  1. GlobalConfiguration.Configuration.EnsureInitialized();Application_Startメソッドの下部に追加します。

OR

  1. 設定全体をGlobalConfiguration.Configureへの単一の呼び出しに移動します。
GlobalConfiguration.Configure(config => 
{
    WebApiConfig.Register(config);
    config.MapAttributeRoutes();
    ...
});

より深く掘る

HttpConfiguration.Configurationには、次のように定義された「Initializer」プロパティがあります。

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized()このアクションを実行し、設定します_ initialized totrue

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

29
tField

関連する問題が発生しました。 GlobalConfiguration.Configureを複数回呼び出すと、このエラーがトリガーされることがあります。回避策として、すべての構成初期化ロジックを1か所に配置しました。

12
Gleno

私にとっての問題は、ルートのクエリ文字列フィールドに名前付きパラメーターを使用しようとしていたことです。

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

クエリ文字列フィールドは自動的にパラメーターにマップされ、実際にはルート定義の一部ではありません。これは動作します:

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

上記の答えは、ケースが設定されていない場合に機能しますが、私の場合、このようなものはすでに設定されています。異なる点は、作成したAPIの1つについて、ルートの前に/を付けたことです。例

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

これを変更する

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

私のためにそれを修正しました

4
The 0bserver

このエラーが「もうすぐ」来るように見える場合、つまり、アプリがしばらくの間完全に正常に動作していた場合、自問してください:コントローラーにアクションを追加するか、これを見る前にルートを変更しましたかエラー?

答えが「はい」の場合(おそらくそうです)、プロセスで間違いを犯した可能性があります。誤ったフォーマット、アクションのコピー/貼り付け、エンドポイント名が一意であることの確認などを忘れると、すべてここで終わります。このエラーがそれを解決する方法について行う提案は、間違ったツリーを起動することを送信できます。

3
Byron Jones

Newtonsoft.Jsonのバージョンがヘルパープロジェクトと比較してメインプロジェクトで異なる場合、このエラーが発生しました。

2

コール

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

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

実行を完了します。

2
abatishchev

「属性ルーティング」のルートテンプレートが適切でない場合、通常この例外が発生します。

たとえば、次のコードを書いたときにこれを得ました:

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

ルート制約構文{parameter:constraint}では、デフォルトの制約はstringタイプです。明示的に言及する必要はありません。

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

ある日、このエラーが発生し始めました。 EnsureInitialized()を呼び出すようにアプリを変更した後、根本的な原因を確認できました。

アクションにカスタム属性、フィルターがありました。その属性クラスは、それが存在するNuGetパッケージに重大な変更を加えていました。

コードを更新してすべてコンパイルしましたが、ローカルIISワーカーは古いDLLを読み込んでおり、初期化中にクラスメンバーを見つけられず、アクションの属性を読み取りました。

何らかの理由で(おそらく注文/ロギングが初期化されたため)、このエラーは発見できず、おそらく例外をキャッチして表面化したEnsureInitialized()を追加するまで、WebAPIが奇妙な状態のままになる可能性がありました。

適切なbinobj cleanを便利なスクリプトで実行すると解決しました。

0
Luke Puplett