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.