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.