Nie można załadować pliku lub zestawu System.Web.Http.WebHost po opublikowaniu w witrynie sieci Web platformy Azure

141

Stworzyłem projekt internetowy i dobrze działa w Visual Studio. Jednak otrzymałem następujący błąd po opublikowaniu go na azurewebsites. Co może powodować problem?

Nie można załadować pliku lub zestawu „System.Web.Http.WebHost, Version = 5.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35” lub jednej z jego zależności. Definicja manifestu zlokalizowanego zestawu nie jest zgodna z odwołaniem do zestawu. (Wyjątek od HRESULT: 0x80131040)

Opis: wystąpił nieobsługiwany wyjątek podczas wykonywania bieżącego żądania internetowego. Zapoznaj się ze śledzeniem stosu, aby uzyskać więcej informacji o błędzie i miejscu jego powstania w kodzie.

Szczegóły wyjątku: System.IO.FileLoadException: nie można załadować pliku lub zestawu „System.Web.Http.WebHost, Version = 5.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35” lub jednej z jego zależności. Definicja manifestu zlokalizowanego zestawu nie jest zgodna z odwołaniem do zestawu. (Wyjątek od HRESULT: 0x80131040)

Błąd źródła:

Podczas wykonywania bieżącego żądania internetowego został wygenerowany nieobsługiwany wyjątek. Informacje dotyczące pochodzenia i lokalizacji wyjątku można zidentyfikować za pomocą poniższego śladu stosu wyjątków.

Śledzenie ładowania zestawu: Poniższe informacje mogą być pomocne w ustaleniu, dlaczego nie można załadować zestawu „System.Web.Http.WebHost, Version = 5.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35”.

WRN: Rejestrowanie powiązań zestawu jest wyłączone. Aby włączyć rejestrowanie błędów powiązań zestawów, ustaw wartość rejestru [HKLM \ Software \ Microsoft \ Fusion! EnableLog] (DWORD) na 1. Uwaga: Istnieje pewien spadek wydajności związany z rejestrowaniem niepowodzenia powiązania zespołu. Aby wyłączyć tę funkcję, usuń wartość rejestru [HKLM \ Software \ Microsoft \ Fusion! EnableLog].

Poniżej znajduje się część pliku web.config.

  <system.web>
    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
  <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers></system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
ca9163d9
źródło

Odpowiedzi:

129

dllBrakuje w opublikowanym (wdrożonego środowiska). To jest powód, dla którego działa w lokalnym, tj. Visual Studio, ale nie w środowisku witryny Azure.

Po prostu wykonaj Copy Local = truewe właściwościach zestawu ( System.Web.Http.WebHost ), a następnie wykonaj ponowne wdrożenie, powinno działać dobrze.

Jeśli pojawi się podobny błąd, tj. Brakuje jakiegoś innego zestawu, ustaw ten zestaw na copylocal = true i przeprowadź ponownie, powtórz to iteracyjnie - jeśli nie jesteś pewien jego zależności.

Naveen Vijay
źródło
2
To Copy Localjuż prawda. O dziwo pokazuje, że Runtime Versionjest v4.0.30319 zamiast v5?
ca9163d9
4
Czy wiesz, co się tutaj wydarzyło? Biegałem dobrze przez 18 miesięcy, kiedy to podskoczyło i ugryzło mnie.
Glenn Gordon
2
To rozwiązało problem. Dzięki! Ale wydaje mi się dziwne, że musimy uwzględnić biblioteki frameworków w naszych projektach (w moim przypadku nie Azure, ale serwer IIS). Czy ktoś wie, czy chodzi o uruchomienie niektórych aktualizacji, więc nie musimy ich już uwzględniać?
edgarpetrauskas
1
Mini-dodatek, ponieważ znalezienie kopii lokalnej zajęło mi wieczność: W VS2013 otwierasz węzeł „referencje” w projekcie i klikasz prawym przyciskiem myszy-> właściwości w bibliotece, w której chcesz ustawić opcję „kopiuj lokalnie”.
ArtHare
6
Jeśli opcja Copy Local jest już ustawiona na true i nie możesz zaktualizować WebApi z powodu zależności, istnieje ta sztuczka, aby ustawić Copy Local na false, budować, a następnie ustawić Copy Local z powrotem na true i budować. Nie wiem, dlaczego to działa.
DeeArgee
90

Jeśli nadal szukasz odpowiedzi, spróbuj sprawdzić ten wątek pytań . Pomogło mi to rozwiązać podobny problem.

edycja: Rozwiązaniem, które mi pomogło, było uruchomienie Update-Package Microsoft.AspNet.WebApi -reinstallz menedżera pakietów NugGet, zgodnie z sugestią Pathoschild. Następnie musiałem usunąć mój plik .suo i zrestartować VS, zgodnie z sugestią Sergeya Osypchuka w tym wątku .

amraby
źródło
Proszę unikać odpowiedzi zawierających tylko linki .. raczej prosimy o umieszczanie odpowiednich informacji z powyższego linku tutaj ..
Anvesh Yalamarthy
3
Uruchomienie polecenia Update-Package rozwiązało problem, ale żadna z pozostałych sugestii nie zadziałała. Dziękuję za Twoją odpowiedź!
DigiOz Multimedia
Najlepsze rozwiązanie problemu.
Festim Cahani
Doskonała odpowiedź, dzięki!
Apolo
3
To rozwiązanie również zadziałało. Jestem prawie pewien, że jest to spowodowane funkcją „Usuń nieużywane zestawy” programu ReSharper. Usuń nieużywane zestawy czasami ślepo usuwa zestawy bez sprawdzania zawartości pakietu NuGet.
Joe King
54

Spotkałem ten sam problem i rozwiązałem go, ustawiając wartość CopyLocaltrue dla następujących bibliotek:

System.Web.Http.dll
System.Web.Http.WebHost.dll
System.Net.Http.Formatting.dll

Muszę dodać, że korzystam z MVC4 i NET 4

Bronek
źródło
dziękuję, to było pomocne. Czy wiesz, dlaczego te pliki nie byłyby po prostu w GAC? Czy to dlatego, że różne witryny mogą używać różnych struktur dotnet itp.?
dellyjm
O ile pamiętam, ten problem wystąpił, ponieważ Microsoft zastosował krytyczne poprawki w tym obszarze (chyba w System.Web / ASP NET / MVC). Myślę, że te przestrzenie nazw nie są w GAC (więc nie w natywnych zespołach NET), ale w oddzielnych ścieżkach Visual Studio lub MVC.
Bronek
To rozwiązało problem na moim VPS (to nie tylko lazurowy problem)
Evilripper
To zadziałało dla mnie (chociaż nie używam Azure). Przenosiłem projekt ze środowiska frameworkowego .net 4.5 do 4.0 i na końcu wszystkiego pojawił się ten problem.
TheQ
1
Zgodnie z sugestią DeeArgee powyżej, miałem już LOCAL COPY = true dla wszystkich 3 z tych bibliotek DLL. Ale ta sugestia w końcu rozwiązała problem: „Jeśli opcja Copy Local jest już ustawiona na true, jest taka sztuczka, aby ustawić Copy Local na false, zbudować, a następnie ustawić Copy Local z powrotem na true i budować. Nie wiem, dlaczego to działa. - DeeArgee listopad 19 '15 o 17:16
Debbie A
34

U mnie pracował nad dodaniem następującej sekcji do web.configpliku:

<configuration>
...
    <runtime>
    ...
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Http.WebHost" publicKeyToken="31bf3856ad364e35" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
        </dependentAssembly>
    ...
    </runtime>
...
</configuration>

Ten przykład oznacza MVC 5.1. Mam nadzieję, że pomoże to komuś rozwiązać taki problem.

Eadel
źródło
2
jesteś niesamowity. działał jak urok w mvc5. Dzięki
David Graça,
2
Dziękuję, dla mnie też pracował +1, osoba, która zadała to pytanie, powinna zaznaczyć to jako odpowiedź!
Ray
Lub po prostu dodaj Microsoft.AspNet.WebApi.WebHostpakiet za pośrednictwem nuget.
Optimax
15

U mnie zaczęło działać po wybraniu „Usuń dodatkowe pliki w miejscu docelowym” w opcjach publikowania plików w ustawieniach w oknie dialogowym publikowania.

Magnus Ahlin
źródło
Pracował dla mnie! Niezłe.
Dr Schizo
To jedyne rozwiązanie, które u mnie zadziałało. Wydaje mi się, że była tam jakaś inna stara wersja biblioteki dll, która się potknęła. Dzięki!
Ohad Schneider
10

W opublikowanym (wdrożonym środowisku) brakuje biblioteki dll. To jest powód, dla którego działa w lokalnym, tj. Visual Studio, ale nie w środowisku witryny Azure.

Po prostu wykonaj Copy Local = true we właściwościach zestawu (System.Web.Http.WebHost), a następnie wykonaj ponowne wdrożenie, powinno działać dobrze.

venkat
źródło
to samo tutaj, dokładnie to było potrzebne.
pabloelustondo
1
Prawdopodobnie dlatego, że jest to to samo rozwiązanie, które opisałem w kilku innych odpowiedziach rok wcześniej.
Czad
6

Używam vs2012 i myślę, że aktualizacja KB2781514 zmieniła niektóre ustawienia. Cały mój System.Web.Http w moim projekcie MVC4 zmienił się na false i nadal otrzymałem tę wiadomość. Zmieniłem właściwość All file in this projectin Publishing, ale nie działa. Wreszcie muszę zmieniać Copy Local = truejeden po drugim i rozwiązać ten problem.

thanh
źródło
2

Otrzymałem ten sam błąd i zmieniłem wersję z 4 na 3 i jest rozwiązany:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <!-- Ensure correct version of MVC -->
    <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
    </dependentAssembly>
</assemblyBinding>
Ilaria
źródło
2

Miałem ten sam problem w mojej aplikacji.

System.web.http.webhost not found.

Wystarczy skopiować system.web.http.webhostplik z głównego projektu, który uruchamiasz w programie Visual Studio, i wkleić go do binkatalogu opublikowanego projektu .

Po tym może pokazać ten sam błąd, ale nazwa katalogu została zmieniona system.web.http. Wykonaj tę samą procedurę, co powyżej. Będzie działać po przesłaniu wszystkich plików. Jest to spowodowane pakietem NuGet w programie Visual Studio, które pobierają z Internetu, ale na serwerze nie mogą go pobrać.

Możesz znaleźć ten plik w binkatalogu swojego projektu .

imran khan
źródło
1

Zdarzyło mi się to w VS2013 (aktualizacja 5) /ASP.NET 4.5, w typie projektu „Aplikacja internetowa”, która obejmuje MVC i Web API 2. Błąd wystąpił zaraz po utworzeniu projektu i przed dodaniem dowolnego kodu. Dodanie poniższej konfiguracji naprawi to za mnie. Po rozwiązaniu problemu „System.Web.Helpers” pojawiły się dwa podobne błędy dotyczące „System.Web.Mvc” i „System.Web.WebPages”.

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
Masoud Safi
źródło
0

Brakowało mi kilku bibliotek DLL. Nawet gdybym ręcznie skopiował je do katalogu przy następnej publikacji, zniknęłyby. Każdy z nich był już ustawiony na Kopiuj lokalnie w VS. Rozwiązaniem dla mnie było ustawienie każdego z nich na Kopiuj lokalnie fałszywe, zapisz, zbuduj, a następnie ustaw każdy tak, aby kopiował lokalnie. Tym razem, kiedy opublikowałem wszystkie biblioteki DLL, które zostały poprawnie opublikowane. Dziwne

Grayson
źródło
0

Jeśli masz wiele projektów w swoim rozwiązaniu i jeden z projektów nie może zostać skompilowany z powodu tego błędu, upewnij się, że zainstalowano pakiet WebApi Core nuget w tym projekcie. Po prostu dodanie odwołania do System.Web.Http nie pomaga, musisz zainstalować poprawny pakiet NuGet w tym projekcie.

Miałem wiele projektów w swoim rozwiązaniu, a WebApi Core był już zainstalowany w innym projekcie. Odwołałem się do zestawu System.Web.Http, klikając prawym przyciskiem myszy i zaznaczając zestaw z listy i nie działał on na platformie Azure, chociaż lokalnie skompilowałby się dobrze. Musiałem usunąć odwołanie ręczne i dodać pakiet WebApi Core nuget do każdego projektu, który wymagał odwołania do zestawu.

Ali
źródło
0

W przypadku, gdy opcja „Kopiuj lokalnie” ma już wartość Prawda, czasami wydaje mi się, że działa, jeśli usuniesz pliki, w których została opublikowana, i ponownie ją opublikujesz.

Na przykład, jeśli korzystasz z usług IIS, usuń witryny internetowe i zawartość katalogu, w którym są publikowane, i ponownie opublikuj.

W miejscu docelowym mogą znajdować się starsze wersje plików, więc aby upewnić się, że nie używasz starszych wersji, usuń wszystko przed ponownym opublikowaniem.

Prasanth Louis
źródło
0

Usunąłem następujący wpis z web.config i zadziałał.

<dependentAssembly>
                <assemblyIdentity name="System.Web.Http.WebHost" culture="neutral" publicKeyToken="31BF3856AD364E35" />
                <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="5.2.6.0" />
            </dependentAssembly>
Ibrahim Mohammed
źródło
0

Upewnij się, że wersja pakietu jest taka sama w całym rozwiązaniu. Właśnie obniżyłem i zaktualizowałem Microsoft.AspNet.Mvcpakiet w ramach rozwiązania, a problem został rozwiązany.

Masoud Darvishian
źródło