ตรวจสอบให้แน่ใจว่า 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 ( .. ) ดังที่ gentiane อธิบายไว้ในคำตอบของพวกเขา วิธีนี้แก้ไขปัญหาได้
Bryan Bedard

1
นั่นคือสิ่งที่GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)จะเรียกหลังจาก configurationCallback
cmxl

4
ข้อผิดพลาดสามารถเกิดขึ้นได้เมื่อทำการกำหนดค่า DI ก่อน GlobalConfiguration.Configure (WebApiConfig.Register) โทร
Silvos

ขอบคุณ. นั่นเป็นหนามที่อยู่ข้างฉัน
Robert Bolton

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

@GeorgyGrigoryev: คุณสามารถยกตัวอย่างในการดำเนินการดังนี้:GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl

69

ฉันได้รับข้อผิดพลาดนี้จริง ๆ เมื่อฉันใช้แอตทริบิวต์การกำหนดเส้นทางภายใน WebApi ของฉัน

ฉันมี

[เส้นทาง ( "WebAPI / siteTypes / {siteTypeId"]

แทน

[เส้นทาง ( "WebAPI / siteTypes / {siteTypeId}"]

สำหรับเส้นทางของฉันและได้รับข้อผิดพลาดนี้ ฉันเพิ่งพลาดวงเล็บปีกกาปิด เมื่อฉันเพิ่มเข้าไปอีกข้อผิดพลาดนี้จะไม่เกิดขึ้นอีก


23
ฉันยังมีปัญหานี้เมื่อฉันนำหน้าเส้นทางด้วยเครื่องหมายทับ [เส้นทาง ("/ api /"]) แทน [เส้นทาง ("api")]
cguedel

1
{int: id} แทน {id: int}
Marat Batalandabad

1
อันนี้ทำให้ฉันตลอดเวลา แต่มันเคยให้ข้อผิดพลาดที่แตกต่างกัน หลังจากอัปเกรดเป็น visual studio 2015 และ. Net 4.6 ฉันได้รับข้อผิดพลาดนี้
ทำให้งง

7
ข้อผิดพลาดของฉันคือ [เส้นทาง ("api / {พารามิเตอร์: string}")] แทน [เส้นทาง ("เส้นทาง api / {พารามิเตอร์}")] เห็นได้ชัดว่าการวาง: สตริงเป็นประเภทผิดเนื่องจากเป็นค่าเริ่มต้น
Jamby

1
คล้ายกับ Jamby ข้อผิดพลาดของฉันคือฉันต้องการ: [Route ("api / ObjectOfInterest / {type} / {name}")] ... แต่: [Route ("api / ObjectOfInterest / {type: string} / {name : string} ")] // ผิด ... ไม่ทำงาน ฉันรู้ว่ามันแปลกที่ฉันต้องการพารามิเตอร์ชื่อ 'ประเภท' ที่เป็นสตริง (และไม่ใช่ System.Type) ... แต่ลบสเปคสตริงและทำงานได้ดี
Aidanapword

31

สิ่งนี้เก่า แต่เป็นผลลัพธ์แรกใน google เมื่อค้นหาข้อผิดพลาดนี้ หลังจากขุดไปเล็กน้อยฉันก็สามารถรู้ได้ว่าเกิดอะไรขึ้น

TLDR:
ทั้งหมดGlobalConfiguration.Configureไม่สามารถเรียกใช้การกระทำของคุณและโทรEnsureInitialized () config.MapAttributeRoutes ()ต้องถูกเรียกใช้ก่อนที่จะมั่นใจว่าSureInitialized ()เนื่องจาก SureInitialized ทำงานเพียงครั้งเดียว

ความหมาย:ถ้าคุณมาจากโครงการ 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รันSureInitializedทันทีหลังจากเรียกการกระทำของคุณ:

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 ที่ทำได้ก่อนที่เส้นทางแรกจะเข้าสู่คุณลักษณะการกำหนดเวอร์ชัน ขอบคุณมาก
Silvos

12

ฉันมีปัญหาที่เกี่ยวข้อง บางครั้งการเรียกGlobalConfiguration.Configureหลายครั้งจะทำให้เกิดข้อผิดพลาดนี้ เพื่อเป็นการหลีกเลี่ยงปัญหาฉันได้วางตรรกะการกำหนดค่าเริ่มต้นทั้งหมดไว้ในที่เดียว


ใช่นี่เป็นปัญหาในกรณีของฉันอย่างแน่นอน
Obi

ขอบคุณ! นี่เป็นปัญหาของฉันอย่างแน่นอน
Søren Boisen

ปัญหาเดียวกันที่นี่! เคยพยายามแก้ไขปัญหานี้มาสองสามชั่วโมงดังนั้น x สำหรับความคิดเห็น
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}")]

แก้ไขให้ฉัน


@ ส่งแน่นอน ดูเหมือนจะเป็นสิ่งที่โง่ แต่ดูเหมือนว่าปัญหาในบางกรณี : P
The 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) { ... }

ในข้อ จำกัด เส้นทางไวยากรณ์ {พารามิเตอร์: จำกัด } จำกัด โดยค่าเริ่มต้นเป็นประเภทสตริง ไม่จำเป็นต้องพูดถึงอย่างชัดเจน

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

0

ฉันเริ่มได้รับข้อผิดพลาดนี้หนึ่งวัน หลังจากฉันเปลี่ยนแอปของเราเพื่อโทรEnsureInitialized()ฉันก็สามารถเห็นสาเหตุของปัญหาได้

ฉันมีแอตทริบิวต์ที่กำหนดเองตัวกรองเกี่ยวกับการกระทำ คลาสของแอตทริบิวต์นั้นมีการเปลี่ยนแปลงอย่างไม่หยุดยั้งในแพ็คเกจ NuGet ที่ใช้งานอยู่

แม้ว่าฉันจะอัปเดตรหัสและรวบรวมได้ทั้งหมดคนงาน IIS ในพื้นที่กำลังโหลด DLL เก่าและไม่พบสมาชิกคลาสในระหว่างการเริ่มต้นอ่านคุณสมบัติในการกระทำ ฯลฯ

ด้วยเหตุผลบางอย่าง (อาจเป็นเพราะคำสั่งซื้อ / เมื่อการบันทึกของเราเริ่มต้น) ข้อผิดพลาดนี้ไม่สามารถค้นพบได้อาจทำให้ WebAPI อยู่ในสถานะแปลกจนกว่าฉันจะเพิ่มEnsureInitialized()ที่จับข้อยกเว้นและเปิดใช้งาน

ดำเนินการที่เหมาะสมbinและobjสะอาดผ่านสคริปต์ที่มีประโยชน์แก้ไขมัน


0

ในกรณีของฉันฉันสร้างบริการเว็บในโครงการ A และเริ่มต้นจากโครงการ B และฉันได้รับข้อผิดพลาดนี้อย่างแน่นอน ปัญหาคือไฟล์. dll บางไฟล์ซึ่ง A ต้องการโดยที่ขาดหายไปในโฟลเดอร์ build-output-folder ของ B ตรวจสอบให้แน่ใจว่าไฟล์. dll เหล่านี้พร้อมใช้งานแล้ว


0

ในกรณีของฉันฉันใช้ Entity เป็นพารามิเตอร์ของการกระทำของฉันว่า 'Schema' หายไป

แอตทริบิวต์ผิด:

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

ถูกต้อง:

[Table("Table name", Schema = "schema name")]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.