Ответ 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.
Вы можете попробовать это и сообщить мне, если это сработало для вас или нет?