Gần đây, tôi đã thực hiện các thay đổi đối với Ứng dụng MVC3 của mình khi cố gắng xử lý đúng các đối tượng DbContext
[1]. Điều này làm việc rất lớn trong phát triển, nhưng một khi ứng dụng đã được đẩy đến máy chủ sản xuất của tôi, tôi bắt đầu liên tục nhận được một số ngoại lệ vui mà sẽ tồn tại cho đến khi AppPool được tái chế. Các trường hợp ngoại lệ có thể được truy trở lại mã trong tùy chỉnh của tôi AuthorizeAttribute
và trông giống như:Các vấn đề sau khi vứt bỏ DbContext
System.InvalidOperationException: The 'Username' property on 'User' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'String'.
System.InvalidOperationException: The 'Code' property on 'Right' could not be set to a 'String' value. You must set this property to a non-null value of type 'Int32'.
(schema Cơ sở dữ liệu trông như thế này: Người dùng: [Guid, String, ...], Quyền: [Guid, Int32,. ..])
Giống như một số "dây đang bị vượt qua" và ứng dụng đang trộn các kết quả từ cơ sở dữ liệu: cố gắng thực hiện kết quả Right
dưới dạng User
và ngược lại.
Để quản lý việc xử lý DbContext
, tôi đặt mã vào để lưu trữ điều này ở cấp độ trên mỗi bộ điều khiển. Khi bộ điều khiển được xử lý, tôi cũng loại bỏ DbContext
. Tôi biết nó là hacky, nhưng AuthorizeAttribute
sử dụng cùng một ngữ cảnh thông qua filterContext.Controller
.
Có điều gì sai khi xử lý vòng đời đối tượng DbContext
trong trang viên này không? Có bất kỳ giải thích hợp lý nào về lý do tại sao tôi nhận được các trường hợp ngoại lệ chéo trên không?
[1] Mặc dù tôi hiểu rằng không cần thiết phải vứt bỏ các đối tượng DbContext
, gần đây tôi đã gặp một số nguồn cho biết đó là phương pháp hay nhất bất kể.
Chỉnh sửa (mỗi @ bình luận MikeSW của)
Một tài sản của AuthorizeAttribute
đại diện cho DbContext
đang được thiết lập trong phương pháp OnAuthorization
, khi AuthorizationContext
là trong phạm vi. Thuộc tính này sau đó được sử dụng theo phương pháp AuthorizeCore
.
Bạn có thể chia sẻ một số mã có liên quan của AuthorizeAttribute tùy chỉnh của mình không? Lưu ý rằng một thuộc tính được sử dụng như một singleton bởi asp.net mvc. Ngoài ra, bạn có đang sử dụng DI Container không? – MikeSW
@MikeSW Tôi đã thêm thông tin về cách sử dụng ở trên. Tôi không sử dụng hộp chứa DI. Với thông tin tôi đã cung cấp ở trên, có vẻ như những lỗi này xảy ra do đồng thời: trong thời gian giữa 'OnAuthorization' và' AuthorizeCore', một yêu cầu khác sẽ kích hoạt 'OnAuthorization' và ghi đè thuộc tính' DbContext'. Điều này có làm theo không? –
Vâng, đó là vấn đề của bạn. [Ủy quyền] về cơ bản là một singleton và bạn đang thay đổi thuộc tính dbcontext với mọi yêu cầu. Tôi đề nghị sử dụng DI Container, đăng ký DbContext với tuổi thọ HttpPerInstance rồi sử dụng DependencyResolver.Current.GetService() trong phương thức OnAuthorization. Các container nên xử lý việc xử lý DbContext cũng như –
MikeSW