gpt4 book ai didi

visual-studio-2010 - 可以在子目录上使用 Web Deploy 的 setAcl 提供程序吗?

转载 作者:行者123 更新时间:2023-12-03 13:30:35 27 4
gpt4 key购买 nike

我正在尝试在 MS Deploy 包中创建一个对应用程序池用户可写的子目录。感谢 helpful post about the setAcl provider通过 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 构建的结果 list 中,我看到了以下 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>

最后一行看起来不错:它附加了我想要可写的子目录,并且访问修饰符似乎都已经足够好地转移了。

但是,当我部署这个包时,我收到一个错误:

Error: A value for the 'setAclUser' setting must be specified when the 'setAcl' provider is used with a physical path.



这是一个令人困惑的错误,因为我并没有尝试在物理路径上设置 ACL,而是在 Web 应用程序的子目录上。查看 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 显然将 Web 应用程序名称替换为我的绝对路径“C:...\obj\Release\Package\PackageTmp”,但是当我将“\doc\public”附加到该绝对路径时,它不再将其识别为网络应用程序目录。另一个受害者 over on the ASP.NET forums 描述了这个确切的问题。没有任何决议。

有谁知道如何通过 Web Deploy 在 Web 应用程序的特定子目录上设置 ACL,而无需手动识别目标主机上的物理路径和应用程序池用户?

最佳答案

好的,让我首先说这比它应该的要难!

我认为它失败的原因是因为当您发布它时,它无法将该文件夹识别为 IIS 应用程序中的文件夹。发生这种情况的原因是,当调用 SetAcl 提供程序时,完整路径正在传输到目的地。取而代之的是,我们需要一个相对于 IIS 应用程序的路径。例如,在您的情况下,它应该类似于:“REST SERVICES/1.0.334/doc/public”。执行此操作的唯一方法是创建一个 MSDeploy 参数,该参数在发布时填充正确的值。除了在源 list 中创建自己的 SetAcl 条目之外,您还必须执行此操作。请按照以下步骤操作。

  • 在与您的项目相同的目录中创建一个名为 {ProjectName}.wpp.targets 的文件(其中 {ProjectName} 是您的 Web 应用程序项目的名称)
  • 在文件中粘贴此列表下方的 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>

    稍微解释一下,目标 SetupCustomAcl 将导致在发布期间使用的源 list 中放置一个新的 SetAcl 条目。这个目标在 之后执行。 AddIisSettingAndFileContentsToSourceManifest target 通过 AfterTargets 属性执行。我们这样做是为了确保在正确的时间创建项目值,并且因为我们需要确保属性 _MSDeployDirPath_FullPath 被填充。

    DeclareCustomParameters 是创建自定义 MSDeploy 参数的位置。该目标将在 之后执行。 AddIisAndContentDeclareParametersItems 目标。我们这样做是为了确保属性 _EscapeRegEx_MSDeployDirPath 被填充。请注意,当我声明使用属性 的参数值(在 Value 元素内)时,该目标内部_DestinationContentPath 这是包含应用程序部署路径的 MSBuild 属性,即 REST Services/1.0.334。

    你能试试看,让我知道它是否对你有用吗?

    关于visual-studio-2010 - 可以在子目录上使用 Web Deploy 的 setAcl 提供程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6861990/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com