Подтвердить что ты не робот

Может ли Web Deploy поставщик setAcl использоваться в подкаталоге?

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

<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" к этому абсолютному пути, он больше не распознает это как каталог веб-приложений. Эта точная проблема описывается другой жертвой

4b9b3361

Ответ 1

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

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

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

{Имя_проекта}.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.

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

Ответ 2

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

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

Это сообщение также имеет преимущество в том, что вы можете указать блок подкаталогов в одной группе ItemGroup.