Pastikan bahwa HttpConfiguration.EnsureInitialized ()

142

Saya telah menginstal Visual Studio 2013 dan ketika saya menjalankan aplikasi saya mendapatkan kesalahan di bawah ini.

Saya tidak tahu ke mana saya harus menginisialisasi objek ini.

Apa yang harus dilakukan?

    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

Ini untuk AlumCloud

Mengisi Stack adalah Apa yang Saya LAKUKAN
sumber

Jawaban:

141

Lihat jawaban @ gentiane di bawah ini untuk cara yang benar untuk menangani ini sekarang.

Pada akhir Application_Startmetode di Global.Asax.cscoba tambahkan: -

GlobalConfiguration.Configuration.EnsureInitialized(); 
Ian Mercer
sumber
3
Saya mendapatkan jawaban ini jadi saya membandingkan proyek saya yang dihasilkan dari versi pratinjau VS 2013 dengan yang dihasilkan dengan Pembaruan 1 dan perbedaannya adalah mereka mengganti WebApiConfig.Register (...) dengan GlobalConfiguration.Configure (. ..) seperti yang dijelaskan oleh gentiane dalam jawaban mereka. Ini menyelesaikan masalah.
Bryan Bedard
1
Itulah tepatnya yang GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)akan memanggil setelah configurationCallback.
cmxl
4
Kesalahan juga dapat terjadi ketika konfigurasi DI dilakukan sebelum GlobalConfiguration.Configure (WebApiConfig.Register); panggilan
Silvos
Terima kasih. Itu duri di sisiku.
Robert Bolton
241

Jika Anda melakukannya di akhir Application_Start akan terlambat, karena WebApiConfig.Register telah dipanggil.

Cara terbaik untuk menyelesaikan ini adalah dengan menggunakan metode inisialisasi baru dengan mengganti di Global.asax:

WebApiConfig.Register(GlobalConfiguration.Configuration);

oleh

GlobalConfiguration.Configure(WebApiConfig.Register);
Tuan-tuan
sumber
12
Berdasarkan dokumentasi Microsoft, ini harus menjadi cara yang tepat untuk melakukannya. asp.net/web-api/overview/web-api-routing-and-actions/…
Dalorzo
Saya telah memigrasi aplikasi mvc, ketika rute api tidak berfungsi, menambahkan ini dan MapHttpAttributeRoutes menghidupkannya.
Phil Cooper
1
Jawaban ini memperbaikinya untuk saya.
GiddyUpHorsey
Tetapi bagaimana jika Anda memiliki kelas non-statis WebApiConfig?
Georgy Grigoryev
@ GeorgyGrigoryev: Anda bisa instantiate di dalam aksi seperti:GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl
69

Saya benar-benar mendapatkan kesalahan ini ketika saya menggunakan Routing Atribut dalam WebApi saya.

Saya punya

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

dari pada

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

untuk rute saya dan mendapat kesalahan ini. Saya baru saja melewatkan braket keriting penutup. Setelah saya menambahkannya kembali, kesalahan ini tidak terjadi lagi.

Jeff Yates
sumber
23
Saya juga mengalami masalah ini ketika saya mengawali rute dengan garis miring [Rute ("/ api /"]) alih-alih [Rute ("api")]
cguedel
1
{int: id} bukannya {id: int}
Marat Batalandabad
1
Yang ini membuat saya selalu, tetapi digunakan untuk memberikan kesalahan yang berbeda. Setelah memutakhirkan ke visual studio 2015 dan .Net 4.6 saya mendapatkan kesalahan ini.
nbering
7
Kesalahan saya adalah [Rute ("api / {parameter: string}")] bukan [Rute ("api / {parameter}")]. Rupanya menempatkan: string sebagai tipe salah karena merupakan default.
Jamby
1
Mirip dengan Jamby, kesalahan saya adalah bahwa saya membutuhkan: [Rute ("api / ObjectOfInterest / {type} / {name}")] ... tetapi: [Rute ("api / ObjectOfInterest / {type: string} / {name : string} ")] // SALAH ... tidak berfungsi. Saya tahu ini aneh bahwa saya memerlukan parameter bernama 'Type' yang merupakan string (dan bukan System.Type) ... tetapi menghapus spesifikasi string dan berfungsi dengan baik.
Aidanapword
31

Ini sudah tua, tetapi merupakan hasil pertama di google saat mencari kesalahan ini. Setelah menggali sedikit, saya bisa mengetahui apa yang sedang terjadi.

tldr:
Semua GlobalConfiguration.Configure lakukan adalah memanggil tindakan Anda dan memanggil EnsureInitialized () . config.MapAttributeRoutes () harus dipanggil sebelum EnsureInitialized () karena EnsureInitialized hanya berjalan sekali.

Artinya: jika Anda berasal dari proyek Mvc yang ada, yang harus Anda lakukan adalah:

  1. Tambahkan GlobalConfiguration.Configuration.EnsureInitialized (); ke bagian bawah metode Application_Start Anda .

ATAU

  1. Pindahkan seluruh konfigurasi Anda menjadi satu panggilan ke GlobalConfiguration.Configure :
GlobalConfiguration.Configure(config => 
{
    WebApiConfig.Register(config);
    config.MapAttributeRoutes();
    ...
});

Menggali lebih dalam

HttpConfiguration.Configuration memiliki properti "Initializer" yang didefinisikan seperti ini:

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized () menjalankan tindakan ini dan menetapkan _initialized menjadi true

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

HttpConfiguration.MapAttributeRoutes memanggil metode internal AttributeRoutingMapper.MapAttributeRoutes yang menetapkan 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 menjalankan EnsureInitialized segera setelah memohon tindakan Anda:

public static void Configure(Action<HttpConfiguration> configurationCallback)
{
    if (configurationCallback == null)
    {
        throw new ArgumentNullException("configurationCallback");
    }

    configurationCallback.Invoke(Configuration);
    Configuration.EnsureInitialized();
}

Jangan lupa, jika Anda berlari ke dinding, sumber untuk asp.net tersedia di http://aspnetwebstack.codeplex.com/SourceControl/latest

tField
sumber
Solusi dengan satu panggilan ke GlobalConfiguration.Configure menyelamatkan hidup saya. Saya memiliki masalah dengan routing berbasis atribut dan konfigurasi DI bersama-sama dengan urutan pemanggilan konfigurasi yang benar. Saya juga menggunakan MS ApiVersioning, di mana saya perlu injeksi DI dilakukan sebelum rute pertama mengenai atribut versi. Terima kasih banyak
Silvos
12

Saya memiliki masalah terkait. Terkadang menelepon GlobalConfiguration.Configureberkali-kali memicu kesalahan ini. Sebagai solusinya, saya telah meletakkan semua logika inisialisasi konfigurasi di satu tempat.

Gleno
sumber
Yup, ini jelas merupakan masalah dalam kasus saya
Obi
Terima kasih! Ini persis masalah saya.
Søren Boisen
Masalah yang sama di sini! Sudah mencoba untuk memperbaiki masalah selama beberapa jam, jadi x untuk komentar.
Sc0tTy
7

Bagi saya, masalahnya adalah saya mencoba menggunakan parameter bernama untuk bidang string kueri di rute saya:

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

Bidang string kueri secara otomatis dipetakan ke parameter dan sebenarnya bukan bagian dari definisi rute. Ini bekerja:

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

Meskipun jawaban di atas berfungsi jika memetikan yang tidak diatur, dalam kasus saya hal ini sudah diatur. Apa yang berbeda adalah bahwa, untuk salah satu API yang saya tulis, saya telah mengawali rute dengan /. Contoh

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

. Mengubah ini menjadi

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

memperbaikinya untukku

0bserver
sumber
@Selamat Memang. Tampak seperti hal yang bodoh, tetapi tampaknya itulah masalahnya dalam beberapa kasus. : P
The 0bserver
@ The0bserver ini bekerja untuk saya juga. Itu sulit untuk mendiagnosa karena pada bagian atas kelas controller saya saya memiliki HttpPrefixdekorator dan kemudian untuk endpoint individu saya saya punya dekorator: [Route("/")]. Dengan hanya melewatkan String kosong di rute memperbaiki masalah.
David
1
Senang itu membantu. :)
The 0bserver
7

JIKA KESALAHAN INI TAMPAKNYA DATANG "DI LUAR NEGERI" , yaitu aplikasi Anda berfungsi dengan baik untuk sementara waktu, tanyakan pada diri sendiri: Apakah saya menambahkan tindakan ke controller atau mengubah rute apa pun sebelum melihat kesalahan ini?

Jika jawabannya adalah ya (dan mungkin juga), Anda mungkin membuat kesalahan dalam prosesnya. Pemformatan yang salah, salin / tempel tindakan dan lupa untuk memastikan nama titik akhir unik, dll. Semuanya akan berakhir di sini. Saran yang dibuat kesalahan ini tentang cara mengatasinya dapat mengirim Anda menggonggong pohon yang salah.

Byron Jones
sumber
Inilah yang terjadi pada saya. Saya mengubah rute tetapi meninggalkan penahan keriting yang salah pada akhirnya seperti ini: [Rute ("GetStuff}")]
Stu Price
2

Panggilan

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

sebelum

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

menyelesaikan eksekusi.

abatishchev
sumber
2

Saya mendapatkan kesalahan ini ketika versi Newtonsoft.Json berbeda di proyek utama saya dibandingkan dengan proyek pembantu

David Lilljegren
sumber
Tambahan cepat: pastikan untuk membersihkan solusi Anda setelah memperbaiki masalah referensi dan periksa kembali apakah DLL yang digunakan akhir adalah versi yang benar :)
Marcel
1

Satu biasanya mendapatkan pengecualian ini ketika templat rute di "Routing Atribut" tidak tepat.

Misalnya, saya dapat ini ketika saya menulis kode berikut:

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

Dalam sintaks kendala rute {parameter: kendala}, kendala secara default adalah tipe string . Tidak perlu menyebutkannya secara eksplisit.

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

Saya mulai mendapatkan kesalahan ini suatu hari. Setelah saya mengubah aplikasi untuk menelepon, EnsureInitialized()saya dapat melihat akar masalahnya.

Saya memiliki atribut khusus, filter, pada tindakan. Kelas atribut itu memiliki perubahan besar yang dibuat dalam paket NuGet di mana ia tinggal.

Meskipun saya telah memperbarui kode dan semuanya dikompilasi, pekerja IIS lokal sedang memuat DLL lama dan tidak menemukan anggota kelas selama inisialisasi, membaca atribut pada tindakan dll.

Untuk beberapa alasan (mungkin karena pesanan / ketika penebangan kami diinisialisasi), kesalahan ini tidak dapat ditemukan, mungkin meninggalkan WebAPI dalam keadaan aneh, sampai saya menambahkan EnsureInitialized()yang menangkap pengecualian dan memunculkannya.

Melakukan yang tepat bindan objbersih melalui skrip berguna menyelesaikannya.

Luke Puplett
sumber
0

Dalam kasus saya, saya membuat layanan web di proyek A dan memulainya dari Proyek B dan saya mendapatkan kesalahan ini. Masalahnya adalah bahwa beberapa file .dll yang diperlukan oleh A di mana tidak ada dalam folder build-output-B.

anion
sumber
0

Dalam kasus saya, saya menggunakan Entitas sebagai parameter tindakan saya bahwa 'Skema' hilang.

Atribut yang salah:

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

Benar :

[Table("Table name", Schema = "schema name")]
Reza Nafisi
sumber