Установите корень документа в приложении Zend Framework 1.12.x в службе Azure Cloud Service

в отношении моего другого вопроса о том, как установить корень документа для Azure Web Site , я хотел бы знать, как сделать то же самое с облачной службой.

Я использовал инструменты Azure Powershell для создания пакета своего приложения и успешно загрузил его в облако. Но настройка корневого документа не работает.

Мой ServiceDefinition.csdef выглядит так:

<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="myCloudService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="myWebRole" vmsize="ExtraSmall"> <Imports /> <Startup> <Task commandLine="setup_web.cmd &gt; log.txt" executionContext="elevated"> <Environment> <Variable name="EMULATED"> <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" /> </Variable> <Variable name="RUNTIMEVERSIONPRIMARYKEY" value="5.3.17" /> <Variable name="RUNTIMEID" value="PHP" /> <Variable name="RUNTIMEURL" value="http://az413943.vo.msecnd.net/php/5.3.17.exe" /> </Environment> </Task> </Startup> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> </WebRole> </ServiceDefinition> 

Теперь я попытался установить физическийDirectoryPath для сайта напрямую

 <Sites> <Site name="Web" physicalDirectory="../htdocs"> ... </Site> </Sites> 

и я попытался использовать VirtualApplication, но оба они не работают.

 <Sites> <Site name="Web"> <VirtualApplication name="MyWeb" physicalDirectory="../htdocs" /> ... </Site> </Sites> 

Любая помощь?

После записи в блоге я нашел решение, которое работает. Я подведу итог, чтобы дать краткое представление о том, как это сделать:

Ссылка: измените корневую папку ваших веб-сайтов

Вы должны добавить задачу запуска da в файл ServiceDefinition.csdef

 <Startup> <Task commandLine="changeroot.cmd" executionContext="elevated" taskType="background" /> </Startup> 

Это дает указание каждому экземпляру при запуске выполнить 'changeroot.cmd'. Этот файл должен перейти в каталог / bin вашего каталога экземпляров веб-роли.

Он содержит следующий код:

 @echo off cd "%~dp0" icacls %RoleRoot%\approot /grant "Everyone":F /T powershell.exe Set-ExecutionPolicy Unrestricted powershell.exe .\changeroot.ps1 ECHO Changeroot Run. >> ..\startup-tasks-log.txt 

Это выполнит скрипт powershell changeroot.ps1 с повышенным правом пользователя, который будет перемещать физическую часть сайта в IIS после его создания. Это также должно идти в ваш / bin путь в вашей веб-роли.

Он содержит следующий код:

 $siteName = "Web" $serverIP = "127.0.0.1" $newPath = "htdocs" ## your document root $pathset = $false $trycount = 0 ##loop until physical path has changed while($pathset -eq $false) { $trycount += 1 ##if the role id can be determined if([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id -ne $null) { $fullName = [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id + "_" + $siteName $op = "Changeroot: Site Full Name: $fullName`r`n" Write-Output $op | Out-File -Encoding Ascii ..\startup-tasks-log.txt ##init server manager $serverManager = [Microsoft.Web.Administration.ServerManager]::OpenRemote($serverIP) if($serverManager -ne $null) { $op = "Changeroot: Site Manager Setup`r`n" Write-Output $op | Out-File -Encoding Ascii ..\startup-tasks-log.txt ##load site $site = $serverManager.Sites | where { $_.Name -eq $fullName } if($site -ne $null) { $op = "Changeroot: Site loaded ($fullName)`r`n" Write-Output $op | Out-File -Encoding Ascii ..\startup-tasks-log.txt ##change physical path $rootApp = $site.Applications | where { $_.Path -eq "/" } $rootVdir = $rootApp.VirtualDirectories | where { $_.Path -eq "/" } $dir = $rootVdir.PhysicalPath.EndsWith('\') if($dir -eq $true) { $rootVdir.PhysicalPath += $newPath + "\" } else { $rootVdir.PhysicalPath += "\" + $newPath + "\" } $serverManager.CommitChanges() $op = "Root changed for $fullName (after $trycount tries)`r`n" Write-Output $op | Out-File -Encoding Ascii ..\startup-tasks-log.txt $pathset = $true exit } } } else { startup-tasks-log.txt } # Restart the loop in 5 seconds Start-Sleep -Seconds 5 } 

Это, наконец, сработало для меня.

Для более подробного объяснения, пожалуйста, перейдите по ссылке.

Дополнительная мера предосторожности:

Убедитесь, что вы создаете свой пакет (или развертываете с помощью publish-azureserviceproject ) с помощью машины сборки, которая имеет подходящую (или меньшую) .net-инфраструктуру как ваш облачный узел. При развертывании на компьютере под управлением Windows 8.1 вам может потребоваться убедиться, что для вашего OSFamily установлено значение 4. Чтобы убедиться, что ваши запущенные среды .net не новее на вашей машине сборки, чем на вашем облачном узле:

  • открыть силовую оболочку на обеих машинах
  • взгляните на [System.Environment]::Version или если вы используете powershell 2.0 или новее, вы можете посмотреть переменную $PSVersionTable

Проблемы, с которыми вы столкнетесь, если вы этого не сделаете – вероятно, вы не сможете использовать ни одну из Azure Assemblies, такую ​​как Microsoft.WindowsAzure.ServiceRuntime. Изменение физического пути веб-сайта зависит от знания имени веб-сайта, и это только (динамически) доступно в этой сборке.