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のプレビューバージョンから生成されたプロジェクトをUpdate 1で生成されたプロジェクトと比較しましたが、WebApiConfig.Register(...)がGlobalConfiguration.Configure(。 ..)ジェンティアンが答えで述べているように。これで問題は解決します。
Bryan Bedard、2014

1
これが、まさにGlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)configurationCallbackの後に呼び出されるものです。
cmxl

4
GlobalConfiguration.Configure(WebApiConfig.Register);の前にDI構成が行われた場合にもエラーが発生する可能性があります。通話
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-actions/...
Dalorzo

私はMVCアプリを移行してきましたが、APIルートが機能していなかったため、これを追加し、MapHttpAttributeRoutesによってすべてが実現しました。
Phil Cooper

1
この答えは私のためにそれを修正しました。
GiddyUpHorsey

しかし、WebApiConfig非静的クラスがある場合はどうなりますか?
Georgy Grigoryev 2017年

@GeorgyGrigoryev:次のようにアクション内でインスタンス化できます:GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl

69

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

持っていた

[ルート( "webapi / siteTypes / {siteTypeId"]

の代わりに

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

私のルートでこのエラーが発生しました。私は単に閉じ中かっこを逃していました。再度追加すると、このエラーは発生しなくなりました。


23
ルートの前に[Route( "api")]ではなくスラッシュ[Route( "/ api /"])を付けたときにもこの問題が発生しました
cguedel

1
{id:int}ではなく{int:id}
Marat Batalandabad

1
これはいつも私を捕まえますが、以前は別のエラーを出していました。Visual Studio 2015および.Net 4.6にアップグレードした後、このエラーが発生します。
15

7
エラーは[Route( "api / {parameter}")]ではなく[Route( "api / {parameter:string}")]でした。どうやら:stringをタイプとして置くのはデフォルトなので間違っています。
ジャンビー2016年

1
Jambyと同様に、私のエラーは私が必要とするものでした:[Route( "api / ObjectOfInterest / {type} / {name}")] ...しかし:[Route( "api / ObjectOfInterest / {type:string} / {name :string} ")] // WRONG ...が機能していませんでした。文字列(およびSystem.Typeではない)である 'Type'という名前のパラメーターが必要なのは奇妙なことですが、文字列の指定を削除すると、正常に機能します。
Aidanapword 2017

31

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

tldr:
すべてGlobalConfiguration.Configureんが、あなたの行動や呼び出しが呼び出すですEnsureInitialized() EnsureInitializedは1回しか実行されないため、config.MapAttributeRoutes ()は、EnsureInitialized ()の前に呼び出す必要があります。

意味:既存のMvcプロジェクトからの場合は、次のことを行うだけです。

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

または

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

より深く掘る

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

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized()はこのアクションを実行し、_initializedtrueに設定します

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を1回呼び出すだけのソリューションで私の命が救われました。属性ベースのルーティングとDI構成、および構成を呼び出す正しい順序に問題がありました。また、MS ApiVersioningを使用しています。最初のルートがバージョン管理属性に達する前に、DIインジェクションを実行する必要がありました。Thxたくさん
Silvos

12

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


うん、これは間違いなく私の場合は問題でした
飫肥

ありがとうございました!これはまさに私の問題でした。
セーレンBoisen

ここで同じ問題!数時間問題を修正しようとしているので、コメントのxです。
Sc0tTy 2018年

7

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

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

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

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

7

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

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

。これを

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

私のために修正しました


@Svend確かに。馬鹿げているように見えたが、かなりの場合それが問題だと思われる。:P
0bserver

@ The0bserverこれも私のために働いた。コントローラークラスの最上位にHttpPrefixデコレーターがあり、次に個々のエンドポイントにデコレーターがあったため、診断が困難でした[Route("/")]。ルートに空の文字列を渡すだけで問題が解決しました。
David

1
それが助けてうれしい。:)
0bserver

7

このエラーが「どこからでも」出てきそうな場合どこからでも場合、つまりアプリがしばらくの間完全に正常に動作していた場合は、次の点を確認してください。このエラーが表示される前に、コントローラにアクションを追加したり、ルートを変更しましたか?

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


これはまさに私に起こったことです。ルートを変更しましたが、[Route( "GetStuff}")]のように最後に誤った波括弧を残していました
Stu Price

2

コール

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

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

実行を完了します。


2

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


簡単な追加:参照の問題を修正した後は必ずソリューションをクリーンアップし、最終的にデプロイされたDLLが正しいバージョンであることを再確認してください:)
Marcel

1

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

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

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

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

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

0

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

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

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

何らかの理由で(おそらく順序付け/ログが初期化されたとき)、このエラーは検出できず、追加するまでWebAPIが奇妙な状態のままになる可能性があります EnsureInitialized()、例外をキャッチして表示するようにするがあります。

便利なスクリプトを使用して適切binかつobjクリーンな処理を行うことで解決しました。


0

私の場合、プロジェクトAでWebサービスを作成し、プロジェクトBから開始したところ、まさにこのエラーが発生しました。問題は、Bのビルド出力フォルダーに欠落しているAが必要とするいくつかの.dllファイルです。これらの.dllファイルが利用可能であることを確認して修正してください。


0

私の場合、「スキーマ」が欠落しているアクションのパラメーターとしてエンティティを使用しました。

間違った属性:

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

正解:

[Table("Table name", Schema = "schema name")]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.