6

Tôi có một trang web ASP.Net khá đơn giản, nội dung có vấn đề khi tải tệp Microsoft.Practices.EnterpriseLibrary.Data khoảng một lần một tuần. Dưới đây là thông điệp ngoại lệ:Tại sao tôi nhận được System.IO.FileLoadException: Không thể tải tập tin hoặc lắp ráp, khoảng một lần một tuần trên trang web ASP.Net của tôi?

System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Access is denied. 
File name: 'Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' 
    at foobar.Intranet.Logic.Data.UserDB.SelectByUserName(String userName) 
    at foobar.Intranet.Logic.Info.User.ValidateUser(String userName) in F:\Development\foobar\foobar\foobar.Intranet.Logic\Info\User.cs:line 130 
    at Login.ValidateUser(String username, String password) in e:\foobar\foobar.Intranet\Login.aspx.cs:line 32 

=== Pre-bind state information === 
LOG: User = Unknown 
LOG: DisplayName = Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null 
(Fully-specified) 
LOG: Appbase = file:///E:/foobar/foobar.Intranet/ 
LOG: Initial PrivatePath = E:\foobar\foobar.Intranet\bin Calling assembly : foobar.Intranet.Logic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: E:\foobar\foobar.Intranet\web.config 
LOG: Using host configuration file: \\?\C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet.config 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/foobar.intranet/668896d8/82d7e51c/Microsoft.Practices.EnterpriseLibrary.Data.DLL. 
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/foobar.intranet/668896d8/82d7e51c/Microsoft.Practices.EnterpriseLibrary.Data/Microsoft.Practices.EnterpriseLibrary.Data.DLL. 
LOG: Attempting download of new URL file:///E:/foobar/foobar.Intranet/bin/Microsoft.Practices.EnterpriseLibrary.Data.DLL. 
ERR: Failed to complete setup of assembly (hr = 0x80070005). Probing terminated. 

Những điều cần chú ý:

  • Một IIS Đặt lại đơn giản sửa chữa vấn đề này.
  • Chúng tôi đã có cùng một mã chạy trên một máy chủ web duy nhất mà không có vấn đề gì. Sau đó chúng tôi chuyển trang web sang hai máy chủ web mới, cân bằng tải (sử dụng các phiên dính) (tất cả ba Windows Server 2003 R2 Standard Edition SP1). Giờ đây, mỗi máy chủ web cân bằng tải sẽ loại trừ ngoại lệ này mỗi tuần một lần.
    • Sự khác biệt lớn duy nhất tôi có thể nghĩ đến, là tôi đã cài đặt 4.0 .NET framework trên các máy chủ cân bằng tải. Trang web vẫn chạy dưới ASP.NET 2.0 nên tôi không thấy đây là vấn đề như thế nào
  • Tôi đã định cấu hình dịch vụ lập chỉ mục để không tìm kiếm trong thư mục "Tệp ASP.NET tạm thời", nhưng nó đã không không giúp được gì.
  • Chúng tôi sử dụng tệp Microsoft.Practices.EnterpriseLibrary.Data ở mọi nơi trên trang web của chúng tôi. Hầu như tất cả các trang sử dụng dll logic của chúng tôi mà lần lượt sử dụng các dlls EnterpriseLibrary.
  • Trong khi các lỗi xảy ra một lần, tôi thậm chí còn nhìn thấy những quy trình đã khóa dll trong thư mục "Temporary ASP.NET Files", và nó không khác gì so với các khóa trên máy chủ hoạt động tốt.
  • Khi lỗi khởi động, nó lỗi mỗi lần duy nhất cho đến khi một iisreset được thực hiện

Bất kỳ cái nhìn sâu sắc bất cứ ai có thể cung cấp sẽ được nhiều đánh giá cao. Hãy cho tôi biết nếu tôi bỏ lỡ một cái gì đó.

Cảm ơn!

+0

Tôi giả định rằng một khi bạn gặp phải vấn đề này thì mọi cuộc gọi đến hội đồng không thành công với thông báo lỗi trên (cho đến khi một iisreset được thực hiện). –

+0

Tuzo - Giả định của bạn là chính xác. Một khi vấn đề bắt đầu, tất cả các cuộc gọi để tải lắp ráp thất bại (cho đến khi một iisreset được thực hiện). – Daryl

+0

Một điều thú vị mà tôi vừa phát hiện ra, đó là IIS Directory Security, Anonymous Access user không phải là IUSR_MachineName, mà là IUSR_OldMachineName. Tôi đã cập nhật tên người dùng dưới người dùng và nhóm người quản lý, nhưng tôi phải cập nhật tài khoản người dùng IIS Anonymous theo cách thủ công. Có ai biết nếu điều đó sẽ ảnh hưởng đến nó? – Daryl

Trả lời

3

Hãy xem Assembly Binding Log Viewer. Nó có thể chỉ cho bạn đi đúng hướng.

Tôi đã xem nhanh các câu trả lời SO khác và một người đã đề xuất rằng ứng dụng có thể đã được phát triển dựa trên phiên bản đã ký của DLL nhưng thời gian chạy sản xuất chỉ có quyền truy cập vào phiên bản chưa ký. Có vẻ như quá trình sản xuất của bạn đang tải một hội đồng chưa ký (PublicKeyToken=null).

+0

Tôi mở Trình xem nhật ký ràng buộc hội đồng, nhưng không có gì hiển thị. Tôi đã cập nhật vị trí của nhật ký thành vị trí tùy chỉnh để nó không xóa nó. Tôi đoán nó sẽ cung cấp cho tôi thông tin giống như thông báo ngoại lệ sau "=== Thông tin trạng thái liên kết trước ===". Tôi tự hỏi liệu "Chính sách không được áp dụng cho tham chiếu tại thời điểm này" có liên quan gì đến nó? Cả sản xuất và phát triển đều sử dụng dấu chưa được ký. Và những vấn đề mà người dùng mô tả, đã xảy ra mọi lúc, không phải mỗi tuần một lần. – Daryl

0

Cài đặt các gói NuGet dưới đây:

Install-Package log4net -version 2.0.0 Install-Package linqtoexcel

Install-Package System.Data.Sqlite.x86 -version 1.0.88.0 Install- Gói dịch vụStack -Phiên bản 3.9.71 Cài đặt gói dịch vụStack.OrmLite.Sqlite32 -Phiên bản 3.9.71