Можно ли использовать в подкаталоге поставщика setAcl Web Deploy? - PullRequest
18 голосов
/ 28 июля 2011

Я пытаюсь сделать подкаталог в пакете MS Deploy доступным для записи пользователю пула приложений. Благодаря полезному посту о провайдере setAcl Кевина Литама я смог получить большую часть того, что мне нужно, в файл моего проекта:

<MsDeploySourceManifest Include="setAcl"
                        Condition="$(IncludeSetAclProviderOnDestination)">
  <Path>$(_MSDeployDirPath_FullPath)\doc\public</Path>
  <setAclAccess>Read,Write,Modify</setAclAccess>
  <setAclResourceType>Directory</setAclResourceType>
  <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings>
</MsDeploySourceManifest>

Обратите внимание, что я добавил "\ doc \ public" в корневой каталог развертывания. В результирующем манифесте, который создает VS2010, я вижу следующий элемент setAcl:

<sitemanifest>
  <contentPath path="C:\Source\...\obj\Debug\Package\PackageTmp" />
  <setAcl path="C:\Source\...\obj\Debug\Package\PackageTmp"
          setAclResourceType="Directory" />
  <setAcl path="C:\Source\...\obj\Debug\Package\PackageTmp"
          setAclUser="anonymousAuthenticationUser"
          setAclResourceType="Directory" />
  <setAcl path="C:\Source\...\obj\Debug\Package\PackageTmp\doc\public"
          setAclResourceType="Directory"
          setAclAccess="Read,Write,Modify" />
</sitemanifest>

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

Однако при развертывании этого пакета появляется сообщение об ошибке:

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

Это сбивающая с толку ошибка, потому что я не пытаюсь установить ACL по физическому пути, а подкаталог веб-приложения. Глядя на вывод MS Deploy, легко увидеть проблему:

Info: Adding setAcl (REST Services\1.0.334).
Info: Adding setAcl (REST Services\1.0.334).
Info: Adding setAcl (C:\...\obj\Release\Package\PackageTmp\doc\public).

MS Deploy, очевидно, подставляет имя веб-приложения для моего абсолютного пути «C: ... \ obj \ Release \ Package \ PackageTmp», но когда я добавляю «\ doc \ public» к этому абсолютному пути, он больше не распознает это как каталог веб-приложений. Эта проблема описана другой жертвой на форумах ASP.NET без разрешения.

Кто-нибудь знает, как установить ACL в определенном подкаталоге веб-приложения через Web Deploy без ручной идентификации физического пути и пользователя пула приложений на целевом хосте?

Ответы [ 2 ]

19 голосов
/ 29 июля 2011

ОК, позвольте мне сначала сказать, что это намного сложнее, чем должно быть!

Я думаю, что причина его сбоя заключается в том, что при публикации он не может распознать папку как папку в приложении IIS. Причина этого заключается в том, что полный путь передается к месту назначения при вызове поставщика SetAcl. Вместо этого нам нужен путь, относящийся к приложению IIS. Например, в вашем случае это должно быть что-то вроде: «REST SERVICES / 1.0.334 / doc / public». Единственный способ сделать это - создать параметр MSDeploy, который будет заполнен правильным значением во время публикации. Это необходимо сделать в дополнение к созданию собственной записи SetAcl в исходном манифесте. Выполните следующие действия.

  1. В том же каталоге, что и ваш проект, создайте файл с именем {ProjectName} .wpp.targets (где {ProjectName} - это имя вашего проекта веб-приложения)
  2. Внутри файла вставьте содержимое MSBuild, которое находится под этим списком
  3. Перезагрузите проект в Visual Studio (VS кэширует файлы проекта в памяти, поэтому этот кэш необходимо очистить).

{ProjectName} .wpp.targets

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="SetupCustomAcls" AfterTargets="AddIisSettingAndFileContentsToSourceManifest">   
    <!-- This must be declared inside of a target because the property 
    $(_MSDeployDirPath_FullPath) will not be defined at that time. -->
    <ItemGroup>
      <MsDeploySourceManifest Include="setAcl">
        <Path>$(_MSDeployDirPath_FullPath)\doc\public</Path>
        <setAclAccess>Read,Write,Modify</setAclAccess>
        <setAclResourceType>Directory</setAclResourceType>
        <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings>
      </MsDeploySourceManifest>
    </ItemGroup>
  </Target>

  <Target Name="DeclareCustomParameters" AfterTargets="AddIisAndContentDeclareParametersItems">
    <!-- This must be declared inside of a target because the property 
    $(_EscapeRegEx_MSDeployDirPath) will not be defined at that time. -->
    <ItemGroup>
      <MsDeployDeclareParameters Include="DocPublicSetAclParam">
        <Kind>ProviderPath</Kind>
        <Scope>setAcl</Scope>
        <Match>^$(_EscapeRegEx_MSDeployDirPath)\\doc\\public$</Match>
        <Value>$(_DestinationContentPath)/doc/public</Value>
        <ExcludeFromSetParameter>True</ExcludeFromSetParameter>
      </MsDeployDeclareParameters>
    </ItemGroup>
  </Target>

</Project>

Чтобы объяснить это немного, целевой SetupCustomAcls заставит новую запись SetAcl помещаться в исходный манифест, используемый во время публикации. Эта цель выполняется после того, как цель AddIisSettingAndFileContentsToSourceManifest выполняется через атрибут AfterTargets. Мы делаем это, чтобы убедиться, что значение элемента создано в нужное время, и потому что нам нужно убедиться, что свойство _MSDeployDirPath_FullPath заполнено.

DeclareCustomParameters - это место, где будет создан пользовательский параметр MSDeploy. Эта цель будет выполняться после цели AddIisAndContentDeclareParametersItems . Мы делаем это, чтобы убедиться, что свойство _EscapeRegEx_MSDeployDirPath заполнено. Обратите внимание, что внутри этой цели, когда я объявляю значение параметра (внутри элемента Value), я использую свойство _DestinationContentPath , которое является свойством MSBuild, содержащим путь к месту развертывания вашего приложения, т.е. REST Services / 1.0.334 .

Можете ли вы попробовать это и сообщить мне, сработало ли это для вас или нет?

3 голосов
/ 03 февраля 2012

FYI - это работает для корневого сайта, если вы следуете соглашению, указанному в посте здесь: http://forums.iis.net/p/1176955/1977169.aspx#1977169

<Match>^$(_EscapeRegEx_MSDeployDirPath)\\@(CustomDirAcl)$</Match>
<DefaultValue>{$(_MsDeployParameterNameForContentPath)}/@(CustomDirAcl)</DefaultValue>
<Value>$(_DestinationContentPath)/@(CustomDirAcl)</Value>

В этом посте также есть возможность указывать блок подкаталоговв одной ItemGroup.

...