Размещение веб-роли Azure с виртуальным приложением отправляет весь проект и не обрабатывает преобразования конфигурации.
Это довольно длинный вопрос, но он объясняет его довольно хорошо.
У меня есть веб-роль с корневым сайтом, который перенаправляет виртуальные приложения под этим сайтом. Мой проект отлично работает локально и почти отлично работает в облаке. Я использую новую конфигурацию сборки, чтобы заставить мой сайт web.config работать в Azure (так как мне нужно использовать состояние сеанса sql).
Во всяком случае, после проверки моего размещенного сайта я вижу 3 сайта в папках 0, 1, 2 соответственно. 0 представляет мой корень, и содержимое этой папки является минимальным для размещенного приложения, только мой bin, default.aspx, packages и web.config. Это прекрасно работает, и я вижу, как это работает, следя за сессиями в моей базе данных.
Тем не менее, при проверке любой из других (идентичных) папок, представляющих виртуальные приложения, я вижу проект ENTIRE visual studio там как есть. Файлы кода, преобразования web.config и т. Д. Более того, преобразования фактически не обрабатываются. Весь проект просто сброшен туда.
Я использовал Visual Studio 2010 для публикации своего приложения в моей веб-роли. Я не вижу ничего очевидного в настройках, чтобы контролировать это поведение. Вот часть моего файла определения сервиса, если это поможет.
<WebRole name="root" vmsize="Small">
<Sites>
<Site name="Web">
<VirtualApplication name="en" physicalDirectory="../../../sitefolder" />
<VirtualApplication name="en-gb" physicalDirectory="../../../sitefolder" />
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
</Endpoints>
<Imports>
<Import moduleName="Diagnostics" />
<Import moduleName="RemoteAccess" />
</Imports>
</WebRole>
<WorkerRole name="emailer" vmsize="ExtraSmall">
<Imports>
<Import moduleName="Diagnostics" />
<Import moduleName="RemoteAccess" />
<Import moduleName="RemoteForwarder" />
</Imports>
</WorkerRole>
Там также есть настройки конфигурации, но я их пропустил. Большое спасибо за любую помощь здесь.
РЕДАКТИРОВАТЬ 1 Вот файл моего проекта Windows Azure в моем решении после внесения изменений, подробно описанных здесь: http://michaelcollier.wordpress.com/2013/01/14/multiple-sites-in-a-web-role/
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
*** entire content as normal and untouched manually ***
<!-- Import the target files for this project template -->
<PropertyGroup>
<VisualStudioVersion Condition=" '$(VisualStudioVersion)' == '' ">10.0</VisualStudioVersion>
<CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Windows Azure Tools\2.0\</CloudExtensionsDir>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Staging01' ">
<OutputPath>bin\Staging01\</OutputPath>
</PropertyGroup>
<PropertyGroup>
<!-- Inject the publication of "secondary" sites into the Windows Azure build/project packaging process. -->
<CoreBuildDependsOn>
CleanSecondarySites;
PublishSecondarySites;
$(CoreBuildDependsOn)
</CoreBuildDependsOn>
<!-- This is the directory within the web application project directory to which the project will be "published" for later packaging by the Azure project. -->
<SecondarySitePublishDir>azure.publish\</SecondarySitePublishDir>
</PropertyGroup>
<!-- These SecondarySite items represent the collection of sites (other than the web application associated with the role) that need special packaging. -->
<ItemGroup>
<SecondarySite Include="..\bobblejob.com\bobblejob.com.csproj" />
</ItemGroup>
<Target Name="CleanSecondarySites">
<RemoveDir Directories="%(SecondarySite.RootDir)%(Directory)$(SecondarySitePublishDir)" />
</Target>
<Target Name="PublishSecondarySites" Condition="'$(PackageForComputeEmulator)' == 'true' Or '$(IsExecutingPublishTarget)' == 'true' ">
<MSBuild Projects="%(SecondarySite.Identity)" Targets="Build;_WPPCopyWebApplication" Properties="Configuration=$(Configuration);Platform=$(Platform);WebProjectOutputDir=$(SecondarySitePublishDir)" />
</Target>
<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />
</Project>
Чтобы сделать эту компиляцию, мне пришлось вручную создать папку "azure.publish" в моей папке bobblejob.com. Может ли ошибка быть там, где вы сказали, что сборка должна выполняться только тогда, когда IsExecutingPublishTarget имеет значение true? Я хочу, чтобы это работало на моем компьютере разработчика и во всех развертываниях, которые я настроил...
- 11/09/13 - это все еще проблема. У кого-нибудь есть решение?
2 ответа
Я думаю, что вы столкнулись с проблемой, очень похожей на ситуацию, о которой я писал в начале этого года. См. http://michaelcollier.wordpress.com/2013/01/14/multiple-sites-in-a-web-role/
По сути, когда Visual Studio упаковывает вашу веб-роль, она "не знает", что файлы, указанные в атрибуте PhysicalDirectory, являются веб-проектами и, следовательно, не выполняет никаких обычных операций сборки (компиляция, преобразование конфигурации и т. Д.).
Мой пост в блоге описывает способ обойти это путем добавления некоторых пользовательских действий в процесс сборки. Надеюсь, поможет!
У меня наконец-то это работает, и это благодаря ссылке выше.
Когда я впервые попробовал этот метод, он не сработал. С тех пор я повторил, и это сработало - перейдите по ссылке выше. Я полагаю, что между попытками обоих методов, которые я прочитал в MSBuild, я смог прочитать и понять, что происходит.
Единственное, что я сделал иначе, я назвал мою временную папку публикации "azure_publish", а не "azure.publish". Я не прочитал достаточно, чтобы знать, является ли точка зарезервированным символом.
Спасибо mcollier. Убедитесь, что вы получите комиссию от Microsoft по этому вопросу.;-)