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>

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.


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 .


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


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.


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.


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.


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.


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>

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 .


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>

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


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.


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.


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>

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.