HttpConfiguration.EnsureInitialized () öğesinin


142

Visual Studio 2013'ü yükledim ve uygulamamı çalıştırdığımda aşağıdaki hatayı alıyorum.

Bu nesneyi nereden başlattığım hakkında hiçbir fikrim yok.

Ne yapalım?

    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

Bu AlumCloud içindir

Yanıtlar:


141

Şimdi bu sorunu çözmenin doğru yolu için @ gentiane'nin cevabına bakınız .

Application_StartYöntemin sonunda şunu Global.Asax.cseklemeyi deneyin: -

GlobalConfiguration.Configuration.EnsureInitialized(); 

3
Bu yanıtı alıyorum, bu yüzden VS 2013'ün önizleme sürümünden oluşturulan projemi Güncelleştirme 1 ile oluşturulan biriyle karşılaştırdım ve fark WebApiConfig.Register (...) yerine GlobalConfiguration.Configure (. ..) gentiane cevaplarında tarif ettiği gibi. Bu sorunu çözer.
Bryan Bedard

1
GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)ConfigurationCallback'ten sonra tam olarak çağrılacak olan budur .
cmxl

4
DI yapılandırması GlobalConfiguration.Configure (WebApiConfig.Register) öncesinde yapıldığında da hata oluşabilir; çağrı
Silvos

Teşekkür ederim. Bu benim yanımda bir diken oldu.
Robert Bolton

241

Bunu Application_Start sonunda yaparsanız, WebApiConfig.Register çağrıldığından çok geç olacaktır.

Bunu çözmenin en iyi yolu, Global.asax içinde değiştirerek yeni başlatma yöntemini kullanmaktır:

WebApiConfig.Register(GlobalConfiguration.Configuration);

tarafından

GlobalConfiguration.Configure(WebApiConfig.Register);

12
Microsoft belgelerine dayanarak, bunu yapmanın doğru yolu olmalıdır. asp.net/web-api/overview/web-api-routing-and-actions/…
Dalorzo

Api yolları çalışmadığında, bir mvc uygulamasını geçiriyorum, bunu ekleyerek MapHttpAttributeRoutes hepsini hayata geçirdi.
Phil Cooper

1
Bu cevap benim için düzeltti.
GiddyUpHorsey

Ama ne durumda u statik olmayan sınıf WebApiConfig varsa?
Georgy Grigoryev

@GeorgyGrigoryev: sadece eylemin içinde böyle GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
başlatabilirsiniz

69

Aslında WebApi içinde Öznitelik Yönlendirme kullanırken bu hatayı aldım.

sahiptim

[Yol ( "WebAPI / siteTypes / {siteTypeId"]

onun yerine

[Yol ( "WebAPI / siteTypes / {siteTypeId}"]

ve bu hatayı aldım. Ben sadece kapanış kıvrık ayraç kaçırmıştı. Tekrar ekledikten sonra bu hata tekrar oluşmadı.


23
Rotayı [Route ("api")] yerine eğik çizgi [Route ("/ api /"]) ile ön eklediğimde de bu sorunu
yaşadım

1
{id: int} yerine {int: id}
Marat Batalandabad

1
Bu beni her zaman yakalar, ama farklı bir hata verirdi. Visual Studio 2015 ve .Net 4.6 sürümlerine geçtikten sonra bu hatayı alıyorum.
nbering

7
Benim hatam, [Route ("api / {parametre}")] yerine [Route ("api / {parametre: string}")] idi. Görünüşe göre koymak: string as type olarak varsayılan olduğundan yanlıştır.
Jamby

1
Jamby'ye benzer şekilde, benim hatam şuydu: [Route ("api / ObjectOfInterest / {type} / {name}")] ... ama: [Route ("api / ObjectOfInterest / {type: string} / {name : string} ")] // YANLIŞ ... çalışmıyor. Ben bir dize (ve bir System.Type değil) 'Type' adlı bir parametreye ihtiyacım garip olduğunu biliyorum ... ama dize şartname kaldırıldı ve iyi çalışıyor.
Aidanapword

31

Bu eskidir, ancak bu hatayı ararken Google'daki ilk sonuçtur. Biraz kazdıktan sonra neler olduğunu anlayabildim.

tldr:
Tüm GlobalConfiguration.Configure eyleminizi çağırır ve EnsureInitialized () öğesini çağırır . EnsureInitialized yalnızca bir kez çalıştığından, config.MapAttributeRoutes () yöntemi EnsureInitialized () öğesinden önce çağrılmalıdır .

Anlamı: Mevcut bir Mvc projesinden geliyorsanız, tek yapmanız gereken:

  1. Ekle GlobalConfiguration.Configuration.EnsureInitialized (); Application_Start yönteminizin altına ekleyin .

VEYA

  1. Tek bir çağrı içine tüm yapılandırmayı Taşı GlobalConfiguration.Configure :
GlobalConfiguration.Configure(config => 
{
    WebApiConfig.Register(config);
    config.MapAttributeRoutes();
    ...
});

Daha Derin Kazmak

HttpConfiguration.Configuration , şu şekilde tanımlanmış bir "Initializer" özelliğine sahiptir:

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized () bu eylemi çalıştırır ve _initialized değerini true değerine ayarlar

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

HttpConfiguration.MapAttributeRoutes, HttpConfiguration.Initializer öğesini ayarlayan AttributeRoutingMapper.MapAttributeRoutes dahili yöntemini çağırır.

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 , eyleminizi çağırdıktan hemen sonra EnsureInitialized'i çalıştırır :

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

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

Bir duvara girerseniz, asp.net kaynağını http://aspnetwebstack.codeplex.com/SourceControl/latest adresinde bulabilirsiniz.


GlobalConfiguration.Configure'a yapılan tek çağrı ile çözüm hayatımı kurtardı. Öznitelik tabanlı yönlendirme ve DI yapılandırması ile birlikte yapılandırmaları çağırmanın doğru sırası ile ilgili sorunlar yaşadım. Ben de MS ApiVersioning kullanır, burada ilk rota sürüm niteliklerine çarpmadan önce DI enjeksiyonları gerekli. Çok
teşekkürler

12

İlgili bir sorun yaşadım. Bazen GlobalConfiguration.Configurebirden çok kez çağırmak bu hatayı tetikler. Geçici bir çözüm olarak, tüm yapılandırma başlatma mantığını tek bir yere koydum.


Evet, bu kesinlikle benim durumumda bir sorundu
Obi

Teşekkür ederim! Bu benim sorunumdu.
Søren Boisen

Burada da aynı sorun var! Birkaç saat boyunca sorunu düzeltmeye çalışıyorum, bu yüzden yorum için x.
Sc0tTy

7

Benim için sorun, benim yollar sorgu sorgu alanları için adlandırılmış parametreleri kullanmaya çalışıyordu oldu:

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

Sorgu dizesi alanları otomatik olarak parametrelere eşlenir ve aslında rota tanımının bir parçası değildir. Bu çalışıyor:

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

7

Yukarıdaki cevap ayarlanmadıysa işe yarar olsa da, Benim durumumda bu şeyler zaten ayarlanmış. Farklı olan, yazmış olduğum API'lardan biri için rotanın önüne bir / eklenmişti. Misal

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

Bunu değiştirerek

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

benim için düzeltti


@ Gerçekten de. Aptalca bir şey gibi görünüyordu, ancak birkaç durumda bu sorun gibi görünüyor. : P
sunucu

@ The0bserver bu benim için de çalıştı. Benim denetleyicisi sınıfının en üstünde ben vardı çünkü teşhis etmek zordu HttpPrefixdekoratör ve sonra benim bireysel nokta için ben dekoratörle vardı: [Route("/")]. Güzergahta boş bir String geçirerek sorunu çözdüm.
David

1
Yardımcı oldu sevindim. :)
sunucu

7

BU HATA "ŞİMDİ YERİNDEN" GELİYORSA , yani uygulamanız bir süre mükemmel çalışıyorsa, kendinize sorun: Bu hatayı görmeden önce bir denetleyiciye bir eylem ekledim veya herhangi bir rotayı değiştirdim mi?

Cevap evet ise (ve muhtemelen öyleyse), muhtemelen süreçte bir hata yaptınız. Yanlış biçimlendirme, bir eylemi kopyalama / yapıştırma ve bitiş noktası adlarının benzersiz olduğundan emin olmayı unutma, vb. Bu hatanın nasıl çözüleceğine dair öneri size yanlış ağacı havlamaya gönderebilir.


Bana tam olarak böyle oldu. Bir rotayı değiştirdim ama sonda şu şekilde hatalı bir kıvırcık ayraç bırakmıştım: [Route ("GetStuff}")]
Stu Price

2

Aramak

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

önce

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

yürütmesini tamamlar.


2

Ana projemde Newtonsoft.Json sürümü yardımcı projeye göre farklı olduğunda bu hatayı aldım


Hızlı ekleme: referans sorununu çözdükten sonra çözümünüzü temizlediğinizden emin olun ve son konuşlandırılan DLL'nin doğru sürüm olup olmadığını iki kez kontrol edin :)
Marcel

1

"Öznitelik Yönlendirmesi" içindeki rota şablonları uygun olmadığında, bu istisna genellikle uygulanır.

Örneğin, aşağıdaki kodu yazarken bunu aldım:

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

Rota kısıtlamaları sözdiziminde {parametresi: kısıtlama}, varsayılan olarak kısıtlama dizgidir . Açıkça bahsetmeye gerek yok.

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

0

Bir gün bu hatayı almaya başladım. Aramak için bizim app değiştirdikten sonra EnsureInitialized()kök neden görmek mümkün.

Bir eylemde özel bir özellik, bir filtre vardı. Bu özellik sınıfının içinde yaşadığı NuGet paketinde büyük bir değişiklik olmuştu.

Kodu güncellemiş olsam da ve derlediğimde, yerel IIS çalışanı eski bir DLL yüklüyor ve başlatma sırasında bir sınıf üyesi bulamıyor, eylemler üzerindeki öznitelikleri vb.

Bazı nedenlerden dolayı (muhtemelen sipariş nedeniyle / günlük kaydımız başlatıldığında), bu hatayı keşfedilemedi, EnsureInitialized()istisnayı yakalayan ve ortaya çıkarana kadar ekleyene kadar WebAPI'yi garip bir durumda bıraktı .

Kullanışlı bir komut dosyası aracılığıyla düzgün binve objtemiz bir şekilde yapılması sorunu çözdü.


0

Benim durumumda web servisini A projesinde oluşturdum ve Project B'den başlattım ve tam olarak bu hatayı aldım. Sorun, B'nin build-output-klasöründe eksik olan A'nın gerektirdiği bazı .dll dosyalarının bu .dll dosyalarının kullanılabilir olduğundan emin olmasıydı.


0

Benim durumumda, 'Şema' eksik olan eylemimin bir parametre olarak bir Varlık kullandım.

Yanlış özellik:

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

Doğru:

[Table("Table name", Schema = "schema name")]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.