2012-11-20 27 views
8

Tôi đang sử dụng phiên bản 2.2.0.0 của Ninject trong ứng dụng biểu mẫu web asp.net và sau vài trăm yêu cầu, đôi khi nó ném ra một NullReferenceException trong phương thức GetProvider của lớp Binding.Ninject - Binding.GetProvider ném NullReferenceException

Ví dụ stack trace: http://pastebin.com/BbhsPQMT

Ngoại lệ duy nhất xảy ra khi tôi căng thẳng thử nghiệm các ứng dụng và nguồn gốc của các ngoại lệ thường khác (giải quyết các giao diện riêng biệt).

Để tìm hiểu lý do tại sao sự cố này xảy ra khi tôi xem mã nguồn Ninject và chèn một số dòng mã cho mục đích gỡ lỗi. Sau đó tôi xác nhận rằng đối tượng là null là thuộc tính ProviderCallback trong lớp Binding.

Tôi cũng đặt một số mã trong toán tử đã đặt của thuộc tính ProviderCallback để hiểu xem nó có được đặt thành không. Sau khi chạy một số thử nghiệm và xem xét một số bãi chứa bộ nhớ có vẻ như là tài sản ProviderCallback không được đặt thành một giá trị null và vì vậy tôi nghĩ rằng dụ được thu thập bởi GC.

Tôi vẫn không hiểu tại sao điều này lại xảy ra ...

Bất kỳ trợ giúp nào được đánh giá cao.

Edit: Chúng tôi nâng cấp lên phiên bản mới nhất của Ninject chỉ để kiểm tra nếu ngoại lệ vẫn xảy ra nhưng chúng tôi đã nhận cùng một ngoại lệ sau khi căng thẳng thử nghiệm ứng dụng: http://pastebin.com/YaiaZndz

+0

Bạn nên báo cáo này. Một NullReferenceException luôn luôn chỉ ra một lỗi trong mã mà ném nó. –

+0

Hãy thử cập nhật lên phiên bản Ninject mới nhất. –

Trả lời

1

Tôi không thể cho bạn biết lý do vấn đề này là tôi không thể tái tạo một hành vi như vậy. Nhưng đây là một số bước bạn có thể thực hiện để xác định vấn đề.

Khi bạn nói vấn đề là do ProviderCallbacknull. Điều này không thể do GC gây ra vì GC sẽ không bao giờ gán null cho một tài sản. Thay vào đó bạn sẽ nhận được một ngoại lệ đã được xử lý hoặc các hành vi lạ khác. Nhưng có một số lý do khác khiến điều này có thể xảy ra như thế nào:

  1. Null được chỉ định một lúc, nhưng vì bạn đã xác minh điều này thì đây không phải là lý do.
  2. Nó chưa bao giờ được gán.
  3. Một BindingConfiguration mới được tạo sau.

Điểm thứ ba có thể dễ dàng được xác minh bằng cách thêm điểm ngắt trong công cụ xây dựng BindingConfiguration. Nó không nên được gọi nữa sau khi kernel được cấu hình thành công và bạn bắt đầu giải quyết các đối tượng.

Đối với vấn đề thứ hai thực hiện những điều sau đây sau khi cấu hình kernel:

var kernel = your fully configured kernel; 
var bindingsField = typeof(KernelBase).GetField("bindings", BindingFlags.NonPublic | BindingFlags.Instance); 
var bindings = bindingsField.GetValue(kernel) as IEnumerable<KeyValuePair<Type, ICollection<IBinding>>>; 

foreach (var bindingsEntry in bindings 
    .Where(bindingsEntry => bindingsEntry.Value 
     .Any(binding => binding.BindingConfiguration.ProviderCallback == null))) 
{ 
    throw new Exception(string.Format("No Provider callback defined for {0}.", bindingsEntry.Key)); 
} 
+0

Xin chào Remo. Xin lỗi vì trả lời trễ nhưng tôi đã cố gắng xem liệu bất kỳ điều kiện nào bạn cung cấp có đúng không. Cả 2 hoặc 3 đều chưa từng xảy ra. Điều này chứng minh rất khó để tái sản xuất bởi vì chỉ xảy ra hàng trăm yêu cầu đến trang aspx. Một điều kỳ lạ tôi thấy, là một StandardKernel thứ hai trong một bãi chứa bộ nhớ nhưng tôi không thể tìm ra nơi nó đã được tạo ra (! Refs và!gcroot chỉ trả lại một gốc cho một mảng lớn các đối tượng có vẻ là một thành viên tĩnh của appdomain - tôi vẫn không hiểu tại sao). –

+0

Bạn không thể tìm ra nơi nó được tạo ra bằng cách thêm một điểm ngắt trong hàm tạo của hạt nhân? –

+0

Remo, tôi tìm thấy lý do tại sao nó được tạo ra. Trong phiên bản 3 của Ninject, bây giờ đã có một sự phụ thuộc cho không gian tên Ninject.Web đang tạo ra một implant của StandardKernel trong Ninject.Web.KernelContainer. Bây giờ tôi đã trở lại vấn đề ban đầu của mình. Tôi không biết phải nhìn sang đâu. Hãy để tôi chỉ nói với bạn rằng chúng tôi cũng đang nhận được một số ActivationExceptions hiếm hoi mà một khi bắt đầu xảy ra, chúng tiếp tục bị ném cho đến khi chúng tôi khởi động lại nhóm ứng dụng. Tôi nghĩ rằng vấn đề này có thể liên quan. Điều này đang xảy ra trong phiên bản 2.2 và tôi cũng có thể nhận được ActivationExceptions hiếm hoi trong phiên bản 3 (sau hàng trăm yêu cầu) –

Các vấn đề liên quan