Đảm bảo rằng httpConfiguration.EnsureInitialized ()


142

Tôi đã cài đặt Visual Studio 2013 và khi tôi chạy ứng dụng của mình, tôi gặp lỗi bên dưới.

Tôi không biết tôi sẽ khởi tạo đối tượng này ở đâu.

Phải làm sao

    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

Cái này dành cho AlumCloud

Câu trả lời:


141

Xem câu trả lời của @ gentiane dưới đây để biết cách xử lý vấn đề này ngay bây giờ.

Khi kết thúc Application_Startphương thức, Global.Asax.cshãy thử thêm: -

GlobalConfiguration.Configuration.EnsureInitialized(); 

3
Tôi đã nhận được câu trả lời này vì vậy tôi đã so sánh dự án của mình được tạo từ phiên bản xem trước của VS 2013 với dự án được tạo bằng Bản cập nhật 1 và điều khác biệt là họ đã thay thế WebApiConfig.Register (...) bằng GlobalConfiguration.Configure (. ..) như gentiane mô tả trong câu trả lời của họ. Điều này không giải quyết vấn đề.
Bryan Bedard

1
Đó chính xác là những gì GlobalConfiguration.Configure(Action<HttpConfiguration> configurationCallback)sẽ gọi sau khi cấu hình.
cmxl

4
Lỗi cũng có thể xảy ra khi cấu hình DI được thực hiện trước GlobalConfiguration.Configure (WebApiConfig.Register); gọi
Silvos

Cảm ơn bạn. Đó là một cái gai ở bên cạnh tôi.
Robert Bolton

241

Nếu bạn làm điều đó ở cuối Application_Start thì sẽ quá muộn, vì WebApiConfig.Register đã được gọi.

Cách tốt nhất để giải quyết vấn đề này là sử dụng phương thức khởi tạo mới bằng cách thay thế trong Global.asax:

WebApiConfig.Register(GlobalConfiguration.Configuration);

bởi

GlobalConfiguration.Configure(WebApiConfig.Register);

12
Dựa trên tài liệu của Microsoft, đây là cách đúng đắn để làm điều đó. asp.net/web-api/overview/web-api-routing-and-actions/...
Dalorzo

Tôi đã di chuyển một ứng dụng mvc, khi các tuyến api không hoạt động, việc thêm ứng dụng này và MapHttpAttributionRoutes đã mang tất cả vào cuộc sống.
Phil Cooper

1
Câu trả lời này đã sửa nó cho tôi.
GiddyUpHorsey

Nhưng trong trường hợp nếu bạn có lớp không tĩnh WebApiConfig thì sao?
Georgy Grigoryev

@GeorgyGrigoryev: bạn có thể khởi tạo nó bên trong hành động như vậy:GlobalConfiguration.Configure(config => new WebApiConfig().Register(config));
cmxl

69

Tôi thực sự đã gặp lỗi này khi tôi đang sử dụng Định tuyến thuộc tính trong WebApi của mình.

Tôi đã có

[Tuyến đường ("webapi / siteTypes / {siteTypeId"]

thay vì

[Tuyến đường ("webapi / siteTypes / {siteTypeId}"]

cho tuyến đường của tôi và đã nhận được lỗi này. Tôi chỉ đơn giản là đã bỏ lỡ khung đóng cửa xoăn. Khi tôi thêm nó trở lại, lỗi này không xảy ra lần nữa.


23
Tôi cũng gặp vấn đề này khi tôi đặt tiền tố tuyến đường bằng dấu gạch chéo [Tuyến đường ("/ api /"]) thay vì [Tuyến đường ("api")]
cguedel

1
{int: id} thay vì {id: int}
Marat Batalandabad

1
Cái này giúp tôi mọi lúc, nhưng nó được sử dụng để đưa ra một lỗi khác. Sau khi nâng cấp lên visual studio 2015 và .Net 4.6 tôi gặp lỗi này.
ngủ gật

7
Lỗi của tôi là [Tuyến ("api / {tham số: chuỗi}")] thay vì [Tuyến ("api / {tham số}")]. Rõ ràng đặt: chuỗi như kiểu là sai vì nó là mặc định.
Jamby

1
Tương tự như Jamby, lỗi của tôi là tôi cần: [Tuyến ("api / ObjectOfInterest / {type} / {name}")] ... nhưng: [Tuyến ("api / ObjectOfInterest / {type: string} / {name : chuỗi} ")] // SAU ... không hoạt động. Tôi biết điều kỳ lạ là tôi cần một tham số có tên 'Loại' đó là một chuỗi (và không phải là System.Type) ... nhưng đã xóa đặc tả chuỗi và nó hoạt động tốt.
Aidanapword

31

Đây là cũ, nhưng là kết quả đầu tiên trên google khi tìm kiếm lỗi này. Sau khi đào được một chút, tôi đã có thể hiểu chuyện gì đang xảy ra.

tldr:
Tất cả GlobalConfiguration.Configure thực hiện việc gọi hành động của bạn và gọi SureInitialized () . config.MapAttributionRoutes () phải được gọi trước SureInitialized () vì SureInitialized chỉ chạy một lần.

Ý nghĩa: nếu bạn đến từ một dự án Mvc hiện có, tất cả những gì bạn phải làm là:

  1. Thêm GlobalConfiguration.Configuration.EnsureInitialized (); đến cuối phương thức Application_Start của bạn .

HOẶC LÀ

  1. Di chuyển toàn bộ cấu hình của bạn thành một cuộc gọi duy nhất đến GlobalConfiguration.Configure :
GlobalConfiguration.Configure(config => 
{
    WebApiConfig.Register(config);
    config.MapAttributeRoutes();
    ...
});

Đào sâu hơn

HttpConfiguration.Configuration có thuộc tính "Trình khởi tạo" được định nghĩa như sau:

public Action<HttpConfiguration> Initializer;

HttpConfiguration.EnsureInitialized () chạy hành động này và đặt _initialized thành true

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

HttpConfiguration.MapAttributionRoutes gọi phương thức nội bộ AttributionRoutingMapper.MapAttributionRoutes thiết lập 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 chạy SureInitialized ngay lập tức sau khi gọi hành động của bạn:

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

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

Đừng quên, nếu bạn chạy vào tường, nguồn cho asp.net có sẵn tại http://aspnetwebstack.codeplex.com/SourceControl/latest


Giải pháp với một cuộc gọi duy nhất đến GlobalConfiguration.Configure đã cứu mạng tôi. Tôi gặp vấn đề với định tuyến dựa trên thuộc tính và cấu hình DI cùng với thứ tự gọi đúng cấu hình. Tôi cũng sử dụng MS ApiVersioning, nơi tôi cần tiêm DI trước khi tuyến đầu tiên chạm vào các thuộc tính phiên bản. Thx rất nhiều
Silvos

12

Tôi đã có một vấn đề liên quan. Đôi khi gọi GlobalConfiguration.Configurenhiều lần gây ra lỗi này. Như một giải pháp thay thế, tôi đã đặt tất cả logic khởi tạo cấu hình ở một nơi.


Phải, đây chắc chắn là vấn đề trong trường hợp của tôi
Obi

Cảm ơn bạn! Đây chính xác là vấn đề của tôi.
Søren Boisen

Vấn đề tương tự ở đây! Đã cố gắng khắc phục sự cố trong một vài giờ, vì vậy x cho nhận xét.
Sc0tTy

7

Đối với tôi, vấn đề là tôi đã cố gắng sử dụng các tham số được đặt tên cho các trường chuỗi truy vấn trong các tuyến đường của mình:

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

Các trường chuỗi truy vấn được tự động ánh xạ tới các tham số và thực tế không phải là một phần của định nghĩa tuyến. Những công việc này:

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

7

Mặc dù câu trả lời ở trên hoạt động nếu không được đặt, nhưng trong trường hợp của tôi, công cụ này đã được đặt. Điều khác biệt là, đối với một trong những API tôi đã viết, tôi đã đặt tiền tố tuyến đường với /. Thí dụ

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

.Thay đổi điều này để

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

sửa nó cho tôi


@Svend Thật vậy. Có vẻ như là một điều ngu ngốc, nhưng dường như đó là vấn đề trong khá nhiều trường hợp. : P
Máy chủ 0bs

@ The0bserver này cũng làm việc cho tôi. Thật khó để chẩn đoán bởi vì ở đầu lớp điều khiển của tôi, tôi có một HttpPrefixngười trang trí và sau đó cho điểm cuối cá nhân của tôi, tôi đã có người trang trí : [Route("/")]. Bằng cách đơn giản chuyển một chuỗi rỗng trong tuyến đã khắc phục sự cố.
David

1
Vui vì nó đã giúp. :)
Máy chủ 0bs

7

NẾU NHỮNG ĐIỀU NÀY LRI NÀY ĐỂ ĐẾN "NGOÀI NGAY BÂY GIỜ" , tức là ứng dụng của bạn đã hoạt động hoàn toàn tốt trong một thời gian, hãy tự hỏi: Tôi đã thêm một hành động vào bộ điều khiển hoặc thay đổi bất kỳ tuyến nào trước khi thấy lỗi này chưa?

Nếu câu trả lời là có (và có lẽ là như vậy), bạn có thể đã mắc lỗi trong quá trình này. Định dạng không chính xác, sao chép / dán một hành động và quên đảm bảo tên điểm cuối là duy nhất, v.v ... tất cả sẽ kết thúc bạn ở đây. Gợi ý rằng lỗi này đưa ra cách giải quyết nó có thể khiến bạn sủa sai cây.


Đây chính xác là những gì đã xảy ra với tôi. Tôi đã thay đổi một tuyến đường nhưng đã để lại một dấu ngoặc nhọn sai lầm ở cuối như thế này: [Tuyến đường ("GetStuff}")]
Stu Giá

2

Gọi

GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

trước

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

hoàn thành việc thực hiện của nó.


2

Tôi đã gặp lỗi này khi phiên bản của Newtonsoft.Json khác với dự án chính của tôi so với dự án trợ giúp


Ngoài ra nhanh chóng: đảm bảo làm sạch giải pháp của bạn sau khi khắc phục sự cố tham chiếu và kiểm tra kỹ xem DLL được triển khai cuối cùng có phải là phiên bản chính xác không :)
Marcel

1

Một người thường có ngoại lệ này khi các mẫu tuyến đường trong "Định tuyến thuộc tính" không phù hợp.

Ví dụ, tôi đã nhận được điều này khi tôi viết đoạn mã sau:

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

Trong cú pháp ràng buộc tuyến {tham số: ràng buộc}, ràng buộc theo mặc định là kiểu chuỗi . Không cần phải đề cập rõ ràng.

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

0

Tôi bắt đầu nhận được lỗi này một ngày. Sau khi tôi thay đổi ứng dụng của chúng tôi để gọiEnsureInitialized() tôi đã có thể thấy nguyên nhân gốc.

Tôi đã có một thuộc tính tùy chỉnh, một bộ lọc, trên một hành động. Lớp thuộc tính đó đã có một thay đổi đột phá được thực hiện trong gói NuGet mà nó sống.

Mặc dù tôi đã cập nhật mã và tất cả được biên dịch, công nhân IIS cục bộ đang tải một DLL cũ và không tìm thấy thành viên lớp trong quá trình khởi tạo, đọc các thuộc tính trên hành động, v.v.

Vì một số lý do (có thể do đơn hàng / khi đăng nhập của chúng tôi được khởi tạo), lỗi này không thể phát hiện được, có thể khiến WebAPI ở trạng thái lạ, cho đến khi tôi thêm vào EnsureInitialized() đó đã bắt gặp ngoại lệ và nổi lên.

Thực hiện đúng binobjsạch thông qua một kịch bản tiện dụng đã giải quyết nó.


0

Trong trường hợp của tôi, tôi đã tạo dịch vụ web trong dự án A và khởi động nó từ Dự án B và tôi đã nhận được chính xác lỗi này. Vấn đề là một số tệp dll được A yêu cầu khi thiếu trong thư mục xây dựng-đầu ra của B. Đảm bảo rằng các tệp dll này có sẵn đã sửa nó.


0

Trong trường hợp của tôi, tôi đã sử dụng một Thực thể làm tham số cho hành động của mình rằng 'Lược đồ' của nó bị thiếu.

Thuộc tính sai:

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

Chính xác :

[Table("Table name", Schema = "schema name")]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.