Web.config не создается в пакете Azure

Я пытаюсь запустить существующее работающее веб-приложение в Azure, используя инструменты SDK версии 2.2. Веб-приложение прекрасно работает как "обычный" сайт MVC 4, а также прекрасно работает в эмуляторе Azure локально. Приложение было разработано для запуска на сервере или в качестве веб-роли.

Все выходные я пытался опубликовать его в Azure, но всегда получаю

Server Error in '/' Application

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

(Это следует после этого, но для целей tl; dr, я думаю, что перенаправление привязки не берется, потому что основная жалоба заключается в том, что System.Web.Mvc 3.0.0.0 не может быть загружен.)

Event code: 3005 
Event message: An unhandled exception has occurred. 
Event time: 11/3/2013 10:36:10 AM 
Event time (UTC): 11/3/2013 10:36:10 AM 
Event ID: 2be088053f02484e95f3f17fcd95b67e 
Event sequence: 1 
Event occurrence: 1 
Event detail code: 0 

Application information: 
Application domain: /LM/W3SVC/1273337584/ROOT-1-130279485699443947 
Trust level: Full 
Application Virtual Path: / 
Application Path: F:\sitesroot\0\ 
Machine name: RD00155D463D30 

Process information: 
Process ID: 1536 
Process name: w3wp.exe 
Account name: NT AUTHORITY\NETWORK SERVICE 

Exception information: 
Exception type: InvalidOperationException 
Exception message: The pre-application start initialization method Initialize on type    Elmah.Mvc.Bootstrap threw an exception with the following error message: Could not load file or assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040).
at System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures)
at System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods)
at System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath)
at System.Web.Compilation.BuildManager.ExecutePreAppStart()
at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)

Could not load file or assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
at Elmah.Mvc.Bootstrap.Initialize()

Request information: 
Request URL: http://blizzard-propressroom.cloudapp.net/ 
Request path: / 
User host address: 176.27.246.0 
User:  
Is authenticated: False 
Authentication Type:  
Thread account name: NT AUTHORITY\NETWORK SERVICE 

Thread information: 
Thread ID: 5 
Thread account name: NT AUTHORITY\NETWORK SERVICE 
Is impersonating: False 
Stack trace:    at System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures)
at System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods)
at System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath)
at System.Web.Compilation.BuildManager.ExecutePreAppStart()
at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)

Я попытался выгрузить ELMAH на тот случай, если это так, но у меня все равно не получается загрузить MVC версии 3.0.0.0.

Теперь, конечно, это имеет некоторый смысл, потому что я использую MVC 4, и это то, что у меня есть в моем пакете.

Запуск v4, конечно, не является проблемой локально, потому что мой Web.config имеет:

<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>

Но, очевидно, Azure WebRoles не может использовать Web.config (и, конечно же, если я найду источник через удаленный рабочий стол, там будет почти пустой файл Web.config).

Я видел предложения о том, что мне нужен app.config, который я пробовал (просто прямая копия web.config), и для параметра Копировать установлено значение Копировать всегда. Я вижу, что есть копия этого в моей папке bin.

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

Итак, после очень длинного поста: кто-нибудь знает, что мне нужно сделать, чтобы сообщить Azure о Binding Redirects? (и вы согласны, что это на самом деле проблема?)

Обновить

Спасибо @viperguynaz за некоторые предложения, но для подтверждения того, что мой System.Web.MVC помечен как копия true. Этим утром я попытался полностью удалить свой проект Azure и использовать параметр "Преобразовать в Windows Azure Cloud Service Project" в Visual Studio на случай, если изначально что-то пошло не так. Но у меня все еще есть та же проблема.

Используя удаленный рабочий стол в службе Azure, я перешел в E:\sitesroot\0. Web.config там практически пустой. Просто:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <machineKey decryption="AES" decryptionKey="F7FA540B4DFD82E5BB196B95D15FF81F6FC418E967F01A1C60FB407A84615031" validation="SHA1" validationKey="6FC418E967F01A1C60FB407A84615031902C0D9A9DE62168764FF0DCE537184F0535D5D9AD66DEDC6FC418E967F01A1C60FB407A84615031902C0D9A97DC1ABF" />
    </system.web>
</configuration>

Там нет никаких признаков моего web.config. Но все остальное присутствует и правильно, включая мой Web.config в папке Views.

Моя последняя сборка и публикация рассказали мне кое-что очень интересное в процессе сборки:

warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll.
warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.WebPages.dll.
warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.Razor.dll
warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.WebPages.Razor.dll.
warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.WebPages.Deployment.dll.

И для всего этого:

MVC assemblies must be added to the package or installed on the virtual machine for your web role. For more details about this, see the following help page: http://go.microsoft.com/fwlink/?LinkId=218227.

Теперь это кажется ясным, за исключением того, что все они настроены на копирование с проектом, а мой проект настроен как веб-роль (как предполагает ссылка). Говорят о том, что нужно создать папку автозагрузки с установкой ASP Net MVC и добавить WebStart cs, но я чувствую, что это устаревший совет, иначе почему бы не "Преобразовать в Windows Azure Cloud Service Project" "делать эти работы?

Обновление 2

Хорошо, похоже, что мой файл Web.config по какой-то причине не упакован. Я откопал проект, который успешно установил в Azure, открыл файл пакета в 7-zip и обнаружил, что с ним связан файл Web.config. В этом проблемном проекте такого файла web.config нет. Я начну пытаться понять, почему.

Я также обновил название проблемы, чтобы отразить эту информацию. Это почти наверняка причина всего.

2 ответа

Решение

Оказывается, это та же ситуация, что и проблема развертывания веб-конфигурации Azure ASP.NET MVC Web.Config.

У моего файла web.config было значение развертывания "none" (как-то), поэтому оно не было включено в пакет, то есть вместо него было создано почти пустое значение по умолчанию.

Я изменил тип развертывания на "Содержимое" (используя Свойства на Web.config), и теперь он в комплекте.

Убедитесь, что в вашем .csproj файл у вас есть файл как таковой, иначе он будет проигнорирован

<ItemGroup>
    ...
    <Content Include="App_Data\XMLDocument.xml" />
    <Content Include="Areas\HelpPage\HelpPage.css" />
    <Content Include="Areas\HelpPage\Views\Web.config" />   <----- THIS LINE
    <Content Include="Areas\HelpPage\Views\Help\Api.cshtml" />
    <Content Include="Areas\HelpPage\Views\Help\DisplayTemplates\ApiGroup.cshtml" />
    ...
</ItemGroup>

(добавлено из-за переполнения очереди на редактирование)

Я не думаю, что вы нашли правильный web.config в вашей сессии RDP. Сайт (веб-приложение) хранится на виртуальном жестком диске, обычно e:\sitesroot\0 или f:\sitesroot\0 - это можно подтвердить, открыв IIS и проверив физический каталог сайтов. В этом каталоге вы найдете файл web.config, который был преобразован в процессе сборки / пакета. Это файл web.config, используемый вашим сайтом. Начните устранение неполадок, добавив <customErrors mode="Off"/> в <system.web> раздел. Затем просмотрите сайт локально из IIS. Я подозреваю, что для System.Web.Mvc у вас не установлено значение Copy Local = True, Далее, ваши настройки сборки web.config должны быть:

  • Build Action = Content
  • Копировать в выходной каталог = не копировать (вам не нужен файл web.config в вашем каталоге bin).

Как правило, для развертываний Azure, если путь к сборке, используемой вашим приложением, не находится в ..\Reference Assemblies\..то вам скорее всего нужно установить Copy Local = True включить сборку в каталог bin.

Другие вопросы по тегам