6

Mam raczej prostą wewnętrzną witrynę ASP.Net, która ma problemy z ładowaniem biblioteki Microsoft.Practices.EnterpriseLibrary.Data około raz w tygodniu. Oto wiadomość Wyjątek:Dlaczego otrzymuję System.IO.FileLoadException: Nie można załadować pliku lub zestawu, około raz w tygodniu na mojej witrynie ASP.Net?

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. 

Rzeczy uwaga:

  • Prosty IIS reset rozwiązuje ten problem.
  • Mieliśmy ten sam kod uruchomiony na jednym serwerze bez żadnych problemów. Następnie przenieśliśmy witrynę na dwa nowe, obciążone zbalastycznie (za pomocą lepkich sesji) serwery internetowe (wszystkie trzy systemy Windows Server 2003 R2 Standard Edition SP1). Teraz każdy z serwerów równoważących obciążenie rzuca ten wyjątek mniej więcej raz w tygodniu tuż poza granice.
    • Jedyna poważna różnica, jaką mogę wymyślić, to to, że zainstalowałem platformę 4.0 .NET na obciążonych serwerach. Witryna nadal działa w środowisku ASP.NET 2.0, więc nie widzę sposobu, w jaki problem ten byłby problemem.
  • Skonfigurowałem usługę indeksowania tak, aby nie wyszukiwała folderu "Tymczasowe pliki ASP.NET", ale nie nie pomóż.
  • Używamy biblioteki Microsoft.Practices.EnterpriseLibrary.Data na naszej stronie. Niemal każda strona korzysta z naszej biblioteki logicznej, która z kolei wykorzystuje biblioteki DLL EnterpriseLibrary.
  • Podczas gdy błędy pojawiały się raz, sprawdziłem nawet, jakie procesy blokowały bibliotekę dll w folderze "Tymczasowe pliki ASP.NET" i nie różniły się od blokad na serwerze, które działało poprawnie.
  • Po uruchomieniu błąd, błędy za każdym razem, dopóki iisreset przeprowadza

Każdy wgląd ktoś mógłby oferować będzie bardzo cenione. Daj mi znać, jeśli coś przeoczyłem.

Dzięki!

+0

Zakładam, że po napotkaniu tego problemu wszystkie wywołania do zespołu kończą się niepowodzeniem z powyższym komunikatem o błędzie (do momentu jest wykonywane). –

+0

Tuzo - Twoje założenie jest prawidłowe. Po uruchomieniu problemu wszystkie wywołania w celu załadowania zespołu nie powiedzie się (do momentu wykonania iisresetu). – Daryl

+0

Jedną z interesujących rzeczy, które właśnie odkryłem, jest to, że użytkownik IIS Directory Security, użytkownik anonimowy nie był IUSR_MachineName, ale IUSR_OldMachineName. Od tego czasu zaktualizowałem nazwę użytkownika pod menedżerami użytkowników i grup, ale musiałem ręcznie zaktualizować konto użytkownika IIS Anonymous. Czy ktoś wie, czy to wpłynie na to? – Daryl

Odpowiedz

3

Spójrz na Assembly Binding Log Viewer. Może wskazać ci właściwy kierunek.

Rzutnie przyjrzałem się innym odpowiedziom na SO, a jedna osoba zasugerowała, że ​​wniosek mógł zostać opracowany na podstawie podpisanej wersji biblioteki DLL, ale środowisko wykonawcze tylko ma dostęp do wersji niepodpisanej. Wygląda na to, że twoja produkcja ładuje niepodpisany zestaw (PublicKeyToken=null).

+0

Otworzyłem przeglądarkę dziennika wiązania montażowego, ale nic się nie pokazało. Zaktualizowałem położenie dziennika do niestandardowej lokalizacji, aby go nie usunął. Zgaduję, że dostarczy mi te same informacje, co komunikat wyjątku po "=== Informacje o stanie pre-bind ===". Zastanawiam się, czy "Polityka, która nie jest stosowana do odniesienia w tym momencie" ma coś z tym wspólnego? Zarówno produkcja, jak i rozwój są bez podpisu. Problemy, które opisywali użytkownicy, zdarzały się za każdym razem, nie raz w tygodniu. – Daryl

0

zainstalować poniższe pakiety Nuget:

Install-Package linqtoexcel log4net -version 2.0.0 Install-Package

Install-Package System.Data.Sqlite.x86 -version 1.0.88.0 Install- Package ServiceStack -Version 3.9.71 Install-Package ServiceStack.OrmLite.Sqlite32 -Version 3.9.71