Nie można załadować pliku lub zestawu „Microsoft.Web.Infrastructure,

79

Próbowałem załadować moją witrynę internetową na serwer. Działało dobrze z moim lokalnym hostem, więc załadowałem wszystko z mojego wwwrootfolderu lokalnego na serwer i zmieniłem parametry połączenia.

Ale jest ten błąd:

Exception information: 
    Exception type: InvalidOperationException 
    Exception message: The pre-application start initialization method Start on type RouteDebug.PreApplicationStart threw an exception with the following error message: Could not load file or assembly 'Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified..
   at System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods)
   at System.Web.Compilation.BuildManager.CallPreStartInitMethods()
   at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)

Could not load file or assembly 'Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
   at RouteDebug.PreApplicationStart.Start()

Projekt był nopcommerce.

Co należy zrobić, aby rozwiązać ten błąd?

user1348351
źródło
kopiowanie prawdopodobnie nie zadziałało, ponieważ host nie ma zainstalowanych tych samych zależności, sprawdź ten przewodnik: iwantmymvc.com/2011-03-23-bin-deploy-aspnet-mvc-3-visual-studio
Mike

Odpowiedzi:

57

Będziesz musiał dołączyć bibliotekę dll do swojego projektu i dodać do niej odwołanie.

Oto łącze do podobnego problemu, który jest już dostępny w Stack: MVC3 Deployment Dependency Problems

Colin Pear
źródło
Czy trzeba przesłać floder "_bin_deployableAssemblies" również na serwer?
user1348351
Istnieje kilka różnych sposobów rozwiązania tego problemu i zależy to również od sposobu wdrażania. Ale jeśli klikniesz link w moim poście, a następnie przejdziesz przez bloga w górnej odpowiedzi z haczykiem, zobaczysz, że jeśli ustawisz go poprawnie, biblioteki DLL z _bin_deployableAssemblies powinny być automatycznie obsługiwane, gdy wykonujesz wdrażać (lub wdrażać w sieci Web). Oto link do wspomnianego przeze mnie bloga.
Colin Pear
5
Blog, do którego prowadzi ten link, wydaje się być już niedostępny. Ta odpowiedź - stackoverflow.com/a/12683392/137474 zadziałała dla mnie.
Baldy,
@ColinPear, wielkie dzięki, właśnie tego szukałem. Miałem aplikację internetową eCommerce, która o to poprosiła!
PatsonLeaner
w moim przypadku moja witryna działa w Plesk bez "Microsoft.Web.Infrastructure.dll", ale po przejściu do cpanel ten błąd pokazał!
Omid-RH
39

Okazuje się, że po przeprowadzeniu czyszczenia odniesienia usunięto go Microsoft.Web.Infrastructure, ale nie z pliku packages.config. Po ponownej próbie dodania go za pomocą programu Package Manager ConsoleVisual Studio mówi, że jest już zainstalowany, co jest fałszywe, ponieważ został usunięty.

Następnie usunąłem wiersz kodu z packages.configpliku

<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />

i ponownie uruchom polecenie

PM> Install-Package Microsoft.Web.Infrastructure

Po tym teraz działa dobrze.

Riaan de Lange
źródło
32

Zainstalowanie AspNetMVC3ToolsUpdateSetup pobranego z tego miejsca rozwiązałoby ten problem bez dodawania odwołania

Sgurijala
źródło
28

Pomimo wielu odpowiedzi dodam jeszcze jedną, która IMHO czyni sprawę nieco jaśniejszą.

Jak już wspomnieli Rob i wrightmailMicrosoft.Web.Infrastructure to pakiet NuGet (link nie jest potrzebny, masz go w Menedżerze pakietów NuGet).

Najwyraźniej odnosił się do niego twój projekt i nagle zniknął. Może istnieć wiele powodów, ale ważne jest to, że pomimo włączenia funkcji automatycznego przywracania pakietów w programie Visual Studio :

  • Zarządzaj pakietami NuGet dla rozwiązania (menu kontekstowe w Eksploratorze rozwiązań),
  • Zezwalaj NuGet na pobieranie brakujących pakietów (ustawień),
  • Automatycznie sprawdzaj brakujące pakiety podczas kompilacji w Visual Studio (ustawienia),

niektóre pakiety mogą wymagać ręcznej ponownej instalacji. Nie wiem, co myli NuGet, może ręczne usuwanie odwołania, ale oto rozwiązanie, które zwykle stosuję w takich przypadkach. Następująca konsola PM pomaga przywrócić pakiet z zachowaniem oryginalnej wersji (bez aktualizacji do prawdopodobnie istniejącej nowej):

Pakiet aktualizacji Microsoft.Web.Infrastructure -Reinstall

Zachowanie wersji może być wymagane, jeśli nie chcesz przypadkowo nadpisać istniejącego pakietu jego nowszą wersją, która prawdopodobnie usunie „starą” funkcjonalność, której mogłeś użyć w swoim projekcie.

I jako dowód, pomimo nieco przydługiego, że wersja się nie zmienia, oto wyjście po wykonaniu polecenia:

PM> Update-Package Microsoft.Web.Infrastructure -Reinstall
Attempting to gather dependencies information for multiple packages with respect to project 'Samples.NuGet\DemoApp\DemoApp', targeting '.NETFramework,Version=v4.5.2'
Attempting to resolve dependencies for multiple packages
Resolving actions install multiple packages
...
Package removal starts here...
...
Removed package 'Microsoft.AspNet.Web.Optimization 1.1.3' from 'packages.config'
Successfully uninstalled 'Microsoft.AspNet.Web.Optimization 1.1.3' from DemoApp
Removed package 'WebGrease 1.5.2' from 'packages.config'
Executing script file 'D:\Projects\DemoApp\packages\WebGrease.1.5.2\tools\uninstall.ps1'
Successfully uninstalled 'WebGrease 1.5.2' from DemoApp
...
More package removals here. Omitted for brevity...
...
Removed package 'Microsoft.Web.Infrastructure 1.0.0.0' from 'packages.config'
Successfully uninstalled 'Microsoft.Web.Infrastructure 1.0.0.0' from DemoApp
...
More package removals here. Omitted for brevity...
...
Removed package 'Antlr 3.4.1.9004' from 'packages.config'
Successfully uninstalled 'Antlr 3.4.1.9004' from MvcLenseApp
Package 'Antlr.3.4.1.9004' already exists in folder 'D:\Projects\Lense.Mvc5\packages'
--- Install packages (in reverse order) ---
Package 'Antlr.3.4.1.9004' already exists in folder 'D:\Projects\DemoApp\packages'
Added package 'Antlr.3.4.1.9004' to 'packages.config'
Successfully installed 'Antlr 3.4.1.9004' to DemoApp
...
More package installs here. Omitted for brevity...
...
Package 'Microsoft.Web.Infrastructure.1.0.0' already exists in folder 'D:\Projects\Lense.Mvc5\packages'
Added package 'Microsoft.Web.Infrastructure.1.0.0' to 'packages.config'
Successfully installed 'Microsoft.Web.Infrastructure 1.0.0' to MvcLenseApp
...
More package installs here. Omitted for brevity...
...
Package 'WebGrease.1.5.2' already exists in folder 'D:\Projects\DemoApp\packages'
Added package 'WebGrease.1.5.2' to 'packages.config'
Executing script file 'D:\Projects\DemoApp\packages\WebGrease.1.5.2\tools\install.ps1'
Successfully installed 'WebGrease 1.5.2' to DemoApp
Package 'Microsoft.AspNet.Web.Optimization.1.1.3' already exists in folder 'D:\Projects\DemoApp\packages'
Added package 'Microsoft.AspNet.Web.Optimization.1.1.3' to 'packages.config'
...
End of package re-install. 
...
Successfully installed 'Microsoft.AspNet.Web.Optimization 1.1.3' to DemoApp
PM> 

Oczywiście, jeśli chcesz ponownie zainstalować wszystkie pakiety, może być konieczne zapoznanie się z poleceniami aktualizacji / instalacji w NuGet tutaj i tutaj .

Aleksandra Christowa
źródło
27

Zauważyłem, że chociaż działał na moim dev boxie, zespół nie został dodany do projektu. Wyszukaj Microsoft.Web.Infrastructure w NuGet i zainstaluj go stamtąd. Następnie upewnij się, że wybrano opcję Kopiuj lokalnie.

jwrightmail
źródło
1
Ten sam problem, był na CopyLocal = True, nie mam pojęcia, dlaczego to nie zadziałało. Twoje rozwiązanie rozwiązało mój problem :)
GôTô
6

Napotkano ten problem na nowej maszynie z systemem Windows 10 na VS2015 z istniejącym projektem. Menedżer pakietów 3.4.4. Włączono przywracanie pakietów.

Przywracanie nie wydaje się działać całkowicie. Musiałem uruchomić następujące polecenie w wierszu poleceń Menedżera pakietów

Update-Package -ProjectName "YourProjectName" -Id Microsoft.Web.Infrastructure -Reinstall

Spowodowało to następujące zmiany w moim pliku rozwiązania, których NIE wykonało przywracanie.

<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
  <Private>True</Private>
</Reference>

Samo dodanie powyższych elementów do sekcji ItemGroup w pliku rozwiązania RÓWNIEŻ rozwiąże problem, pod warunkiem, że istnieje plik .. \ packages \ Microsoft.Web.Infrastructure.1.0.0.0 \ lib \ net40 \ Microsoft.Web.Infrastructure.dll.

Łatwiej jest po prostu wykonać opcję -Reinstall, ale dobrze jest zrozumieć, co robi inaczej niż przywracanie pakietu.

Rohan
źródło
Miałem ten sam problem. Wypróbowano opcję „Przywróć pakiety NuGet” w menu prawym przyciskiem myszy. Wynik powiedział mi, że nie ma nic do przywrócenia. Zgodnie z twoją radą uruchomiłem Update-Package -ProjectName „nazwa mojego projektu tutaj” z konsoli menedżera pakietów i wszystkie pakiety zostały poprawnie dodane
Rob Bowman
@RobBowman To świetnie Rob. W twoim przypadku może to nie mieć znaczenia, ale uważaj, aby dołączyć również flagę -Reinstall. Zapewni to, że otrzymasz te same wersje pakietów, co wcześniej. Jeśli pominiesz tę flagę, zaktualizuje pakiet do najnowszej wersji, co może powodować problemy, jeśli nie zamierzałeś tego zrobić. Zobacz to, aby uzyskać pełne informacje docs.microsoft.com/en-us/nuget/tools/ps-ref-update-package
Rohan
5

Resharper wykrył Microsoft.Web.Infrastructure jako nieużywane odniesienie, więc go usunąłem. Lokalnie działało dobrze, ale po opublikowaniu dla programistów pojawił się ten sam błąd.

Podsumowując, uważaj podczas usuwania odniesień oznaczonych jako nieużywane przez Resharper

Javier
źródło
To było dokładnie to, co zrobiłem.
AndreFeijo
w moim przypadku moja witryna działa w Plesk bez "Microsoft.Web.Infrastructure.dll", ale po przejściu do cpanel ten błąd pokazał!
Omid-RH
3

Miałem podobny problem. NuGet pokazał, że pakiet został pomyślnie zainstalowany, ale odwołanie nie zostało dodane do mojego projektu.

Uruchomienie <PM> Install-Package Microsoft.Web.InfraStructurerównież nie pomogło, ponieważ menedżer pakietów powtarzał, że jest już zainstalowany

W końcu dodałem go ręcznie, edytując plik csproj i dodając te linie:

 <Reference Include="Microsoft.Web.Infrastructure">
  <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
  <Private>True</Private>
</Reference>

To rozwiązało problem.

wspomnienie snu
źródło
Sprawdziłem plik csproj i odnosił się on do folderu, który był przyczyną problemu. Usunięcie tej dodatkowej nazwy folderu rozwiązało mój problem
superachu
2

Należy pobrać platformę ASP.NET MVC na serwer obsługujący aplikację. To szybka poprawka, wystarczy pobrać i zainstalować stąd (to jest framework MVC 3 http://www.asp.net/mvc/mvc3 ), a następnie bum, możesz już iść.

KickerKeeper
źródło
2

Dla mnie Microsoft.Web.Infrastructure.dllbrakowało w folderze bin, nie ustawiono kopiowania lokalnego w projekcie. Skopiowano bibliotekę dll z innego projektu w rozwiązaniu i strona wczytuje się.

Alex Hedley
źródło
2

Najpierw usuń Microsoft.Web.Infrastructure z package.config.

i ponownie uruchom polecenie

PM> Install-Package Microsoft.Web.Infrastructure i upewnij się, że właściwość Copy Local powinna mieć wartość true.

Amrendra
źródło
1

Bardzo proste rozwiązanie:

W programie Visual Studio przejdź do Tools / Library Package Manager / Package Manager Console

<PM> Install-Package Microsoft.Web.InfraStructure

Baw się dobrze

Omid Rahimi
źródło
1

Oto mój scenariusz.

Miałem rozwiązanie wieloprojektowe zawierające projekty A, B, C .. N.

Projekt B był biblioteką kodu zawierającą fabrykę selectlistobiektów.

Projekt działałby zgodnie z oczekiwaniami w fazie rozwoju, ale podczas publikowania w naszym środowisku testowym otrzymywałem napotkany błąd:

Could not load file or assembly 'Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

Zdarzyło się to za pośrednictwem menedżera pakietów NuGet, przypadkowo zainstalowałem „Microsoft ASP.NET MVC”, który zainstalował zależności dla:

  • Microsoft.AspNet.Razor
  • Microsoft.AspNet.WebPages

I oto, Microsoft.AspNet.WebPages zależy od „Microsoft.Web.Infrastructure”.

Moim rozwiązaniem było odinstalowanie trzech wspomnianych powyżej pakietów (MVC, Razor, WebPages), a następnie kliknięcie prawym przyciskiem myszy odwołań> dodaj odwołanie> Złożenia> Rozszerzenia> System.Web.MVC.

Obrabować
źródło
Nie mogłem dodać przez Assembles, ale dodanie z powrotem pakietów Nuget rozwiązało problem
Nitesh
1

Musiałem ustawić „Kopiuj lokalnie” we właściwościach odniesienia na Fałsz, a następnie z powrotem na Prawda. Spowoduje to dodanie ustawienia Private True do pliku .csproj.

<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">      <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
      <Private>True</Private>
    </Reference>

Założyłem, że to już zostało ustawione, ponieważ "Kopiuj lokalnie" pokazało się jako Prawda.

Cierpliwość
źródło
0

Nie wiem, co się stało z moim projektem, ale odwołuje się on do niewłaściwej ścieżki do biblioteki DLL. Nuget zainstalował go poprawnie i rzeczywiście był w moim systemie plików wraz z innymi pakietami, ale po prostu odwoływał się nieprawidłowo.

packagesFolder istnieje dwa katalogi z mojego projektu i dopiero będzie się jeden po uruchomieniu ścieżkę z ..\packages\. Zmieniłem ścieżkę na początek ..\..\packages\i naprawiłem mój problem.

Jeff LaFay
źródło
0

Na moim komputerze zależność NuGet nie została poprawnie pobrana, folder lib w pakiecie NuGet nie istniał, stąd błąd.

Przed

wprowadź opis obrazu tutaj

Zmieniłem nazwę pakietu Nuget w folderze pakietów, a Nuget ponownie załadował go poprawnie z wymaganym folderem lib.

Po wprowadź opis obrazu tutaj

Morgan Kenyon
źródło
0

W niektórych przypadkach czyszczące projektu / roztworu, fizycznie usuwając bin/a obj/i odbudowy rozwiąże takich błędów. Może się to zdarzyć, gdy na przykład niektóre pakiety i odniesienia są instalowane / dodawane, a następnie usuwane, pozostawiając pewne artefakty.

Zdarzyło mi się to z Microsoft.Web.Infrastructure: początkowo projekt nie wymagał tego montażu. Po kilku eksperymentach, których efekt netto miał wynosić zero na końcu, dostałem ten wyjątek. Powyższe kroki rozwiązały problem bez konieczności instalowania nieużywanej zależności.

Oleg Shirokikh
źródło
0

Miałem ten problem. Miałem bibliotekę DLL dołączoną do projektu, a ustawienie Kopiuj lokalne było domyślnie prawdziwe. Nie wiem, dlaczego to się zaczęło, ponieważ ta biblioteka DLL była w projekcie przez długi czas. Słyszałem kilka wzmianek o tym, że ReSharper prawdopodobnie go usuwał, ale nie mogę powiedzieć, że przeprowadziłem usuwanie nieużywanych referencji.

Pomogło mi: - Uruchomienie „Update-Package Microsoft.Web.Infrastructure -Reinstall” w projekcie, który zaktualizował całe rozwiązanie, ale nie pomógł sam w sobie. - Następnie przejrzałem odniesienia do projektów i ustawiłem Copy Local na false, a następnie z powrotem na true. W rzeczywistości spowodowało to dodanie wiersza do pliku CSPROJ pod referencją DLL: True. Albo coś w rodzaju ... Tak czy inaczej, teraz kompilacja kopiowała pliki zgodnie z oczekiwaniami.

Jurijs Kastanovs
źródło
0

Oto, co zadziałało w moim przypadku przy użyciu VS2019. Otrzymałem ten błąd podczas próby zaktualizowania pakietów Nuget w jednym projekcie, podczas gdy Microsoft.Web.Infrastructure znajdował się w innym projekcie w tym samym rozwiązaniu. Musiałem usunąć folder Microsoft.Web.Infrastructure.1.0.0.0 z folderu Pakiety mojego projektu. Ponownie zainstalowałem go przez nuget, a następnie wszystko zaczęło działać ponownie. Zwariowane rzeczy.

Shane Cessna
źródło