Не удалось загрузить файл или сборку System.Web.Http.WebHost после публикации на веб-сайте Azure

143

Я создал веб-проект, и он хорошо работает в Visual Studio. Однако после публикации на веб-сайтах azure я получил следующую ошибку. Что может вызвать проблему?

Не удалось загрузить файл или сборку System.Web.Http.WebHost, Version = 5.0.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35 или одну из их зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека, чтобы получить дополнительную информацию об ошибке и ее происхождении в коде.

Сведения об исключении: System.IO.FileLoadException: не удалось загрузить файл или сборку System.Web.Http.WebHost, Version = 5.0.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35 или одну из его зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Ошибка источника:

Необработанное исключение было создано во время выполнения текущего веб-запроса. Информацию о происхождении и местонахождении исключения можно определить с помощью трассировки стека исключений ниже.

Отслеживание загрузки сборки: следующая информация может помочь определить, почему сборка «System.Web.Http.WebHost, Version = 5.0.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35» не может быть загружена.

WRN: ведение журнала привязки сборки выключено. Чтобы включить ведение журнала сбоев привязки сборок, установите для параметра реестра [HKLM \ Software \ Microsoft \ Fusion! EnableLog] (DWORD) значение 1. Примечание. С ведением журнала сбоев привязки сборок связано некоторое снижение производительности. Чтобы отключить эту функцию, удалите значение реестра [HKLM \ Software \ Microsoft \ Fusion! EnableLog].

Следующее - часть файла 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
источник

Ответы:

130

В dllОтсутствует в опубликованной (развернутой среде). По этой причине он работает в локальной среде, то есть в Visual Studio, но не в среде веб-сайта Azure.

Просто сделайте Copy Local = trueв свойствах сборки ( System.Web.Http.WebHost ), а затем выполните повторное развертывание, все должно работать нормально.

Если вы получаете аналогичную ошибку, то есть отсутствует какая-то другая сборка, сделайте для этой сборки copylocal = true и повторно разверните, повторите это итеративно - если вы не уверены в ее зависимостях.

Навин Виджай
источник
2
Это Copy Localуже правда. Странно показывает Runtime Versionv4.0.30319 вместо v5?
ca9163d9 03
4
Вы знаете, что здесь произошло? Я прекрасно бегал 18 месяцев, когда это подскочило и укусило меня.
Гленн Гордон
2
Это устранило проблему для меня. Спасибо! Но мне кажется странным, что мы должны включать библиотеки фреймворков в наши проекты (в моем случае не Azure, а сервер IIS). Кто-нибудь знает, нужно ли запускать какие-то обновления, чтобы нам больше не приходилось их включать?
edgarpetrauskas
1
Мини-надстройка, так как мне потребовалась вечность, чтобы найти локальную копию: в VS2013 вы открываете узел «ссылки» в проекте и щелкаете правой кнопкой мыши-> свойства в библиотеке, для которой хотите установить «локальное копирование».
ArtHare
6
Если для Copy Local уже установлено значение true, и вы не можете обновить WebApi из-за зависимостей, есть этот трюк, чтобы установить для Copy Local значение false, построить, затем снова установить для Copy Local значение true и построить. Не знаю, почему это работает.
DeeArgee
90

Если вы все еще ищете ответ, попробуйте проверить эту ветку вопросов . Это помогло мне решить аналогичную проблему.

edit: Решение, которое помогло мне, заключалось в запуске Update-Package Microsoft.AspNet.WebApi -reinstallиз диспетчера пакетов NugGet, как было предложено Pathoschild. Затем мне пришлось удалить мой файл .suo и перезапустить VS, как предложил Сергей Осипчук в этой теме .

Amraby
источник
Пожалуйста, избегайте ответов только по ссылкам. Пожалуйста, разместите соответствующую информацию из приведенной выше ссылки здесь ..
Анвеш Яламарти
3
Запуск команды Update-Package разрешил проблему, тогда как ни одно из других предложений не помогло. Спасибо за ответ!
DigiOz Multimedia
Лучшее решение проблемы.
Festim Cahani
Прекрасный ответ, спасибо!
Apolo
3
Это решение сработало и для меня. Я почти уверен, что это было вызвано функцией ReSharper «Удалить неиспользуемые сборки». Удаление неиспользуемых сборок иногда слепо удаляет сборки без проверки содержимого пакета NuGet.
Джо Кинг
55

Я столкнулся с той же проблемой и решил ее, установив CopyLocalзначение true для следующих библиотек:

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

Я должен добавить, что использую MVC4 и NET 4

Бронек
источник
спасибо, это было полезно. Вы знаете, почему этих файлов не было бы просто в GAC? Это потому, что разные сайты могут использовать разные структуры dotnet и т. Д.?
dellyjm 05
Насколько я помню, эта проблема возникла после того, как Microsoft применила критические исправления в этой области (я думаю, в System.Web / ASP NET / MVC). Я предполагаю, что эти пространства имен находятся не в GAC (то есть не в собственных сборках NET), а в отдельных путях Visual Studio или MVC.
Бронек
Это устранило проблему на моем VPS (это не только проблема с лазурным)
Evilripper
У меня это сработало (хотя я не использую Azure). Я перемещал проект из среды фреймворка .net 4.5 в среду 4.0 и в конце концов получил эту проблему.
TheQ
1
Согласно предложению DeeArgee выше, у меня уже была ЛОКАЛЬНАЯ КОПИЯ = true для всех трех этих dll. Но это предложение, наконец, решило проблему: «Если для Copy Local уже установлено значение true, существует этот трюк, чтобы установить для Copy Local значение false, построить, затем снова установить для Copy Local значение true и построить. Я не знаю, почему это работает. - DeeArgee 19 нояб., В 17:16
Debbie A
34

У меня сработало добавление следующего раздела в web.configфайл:

<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>

Этот пример обозначает MVC 5.1. Надеюсь, это поможет кому-то решить эту проблему.

Эдель
источник
2
ты обалденный. работал как шарм в mvc5. Спасибо
Дэвид Граса
2
Спасибо, у меня тоже сработало +1, человек, задавший этот вопрос, должен отметить это как ответ!
Ray
Или просто добавьте Microsoft.AspNet.WebApi.WebHostпакет через nuget.
Optimax
16

Для меня это начало работать после выбора «Удалить дополнительные файлы в месте назначения» в параметрах публикации файлов в настройках диалогового окна публикации.

Магнус Алин
источник
Сработало у меня! Хороший.
Dr Schizo
Это единственное решение, которое сработало для меня. Я предполагаю, что там была какая-то другая старая версия dll, которая сбивала с толку. Благодарность!
Охад Шнайдер
10

DLL отсутствует в опубликованной (развернутой среде). По этой причине он работает в локальной среде, то есть в Visual Studio, но не в среде веб-сайта Azure.

Просто сделайте Copy Local = true в свойствах сборки (System.Web.Http.WebHost), а затем выполните повторное развертывание, все должно работать нормально.

Венкат
источник
Здесь же, это именно то, что было нужно.
pabloelustondo
1
Вероятно, потому, что это то же самое решение, которое описано в нескольких других ответах годом ранее.
Чад
6

Я использую vs2012, и я думаю, что обновление KB2781514 изменило некоторые настройки. Весь мой System.Web.Http в моем проекте MVC4 изменился на false, и я продолжаю получать это сообщение. Я изменил All file in this projectсвойство публикации, но оно не работает. Наконец-то пришлось менять Copy Local = trueпо одному и решил эту проблему.

чем
источник
2

У меня такая же ошибка, и я изменил свою версию с 4 на 3, и она решена:

<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

У меня была такая же проблема в моем приложении.

System.web.http.webhost not found.

Вам просто нужно скопировать system.web.http.webhostфайл из вашего основного проекта, который вы запускаете в Visual Studio, и вставить его в binкаталог опубликованного проекта .

После этого он может показать ту же ошибку, но имя каталога будет изменено, это может быть system.web.http . Выполните ту же процедуру, что и выше. Он заработает после того, как все файлы будут загружены. Это связано с тем, что пакет nuget в Visual Studio загружается из Интернета, но на сервере он не может его загрузить.

Вы можете найти этот файл в каталоге вашего проекта bin.

Имран Хан
источник
1

Это случилось со мной на VS2013 (обновление 5) /ASP.NET 4.5 в рамках типа проекта «Веб-приложение», которое включает MVC и веб-API 2. Ошибка произошла сразу после создания проекта и до добавления любого кода. Добавление следующей конфигурации исправит это для меня. После устранения проблемы «System.Web.Helpers» возникли еще две похожие ошибки для «System.Web.Mvc» и «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

Мне не хватало нескольких DLL. Даже если я вручную скопирую их в каталог при следующей публикации, они исчезнут. Каждый из них уже был настроен на локальное копирование в VS. Для меня исправление заключалось в том, чтобы установить для каждого из них значение «Копировать локально false», «сохранить», «построить», а затем установить для каждого из них локальное копирование true. На этот раз, когда я опубликовал, все библиотеки DLL опубликованы правильно. Странный

Грейсон
источник
0

Если у вас есть несколько проектов в вашем решении, и один из ваших проектов не может быть построен из-за этой ошибки, убедитесь, что вы установили пакет nuget WebApi Core в этом проекте. Простое добавление ссылки на System.Web.Http не помогает, вам необходимо установить правильный пакет nuget в этот проект.

В моем решении было несколько проектов, а WebApi Core уже был установлен в другом проекте. Я сослался на сборку System.Web.Http, щелкнув правой кнопкой мыши и отметив сборку в списке, и она не сработала в Azure, хотя локально все будет нормально. Мне пришлось удалить справочную информацию и добавить пакет nuget WebApi Core в каждый проект, которому требовалась ссылка на сборку.

Али
источник
0

В случае, если "Copy Local" уже имеет значение True, я иногда считаю, что это сработает, если вы удалите файлы, в которых он был опубликован, и опубликуете снова.

Например, если вы используете IIS, удалите веб-сайты и содержимое каталога, в котором они опубликованы, и опубликуйте снова.

В месте назначения могут быть более старые версии файлов, поэтому, чтобы убедиться, что вы не используете старые версии, удалите все перед повторной публикацией.

Прасант Луи
источник
0

Я удалил следующую запись из web.config, и у меня она сработала.

<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

Убедитесь, что версия пакета одинакова во всем решении. Я просто понизил и обновил Microsoft.AspNet.Mvcпакет решения, и проблема решена.

Масуд Дарвишян
источник