如何防止Visual Studio的Web发布删除目标网站的写入权限?

13

我有一个网络应用程序(实际上是Orchard CMS),我正在进行自定义,并且希望使用Web Publishing aka MSDeploy直接从我的构建服务器推送到托管提供商。

问题是,当我发布网站(从Visual Studio发布,还没有从构建服务器尝试过)时,它会从目标网站中删除写入权限,这使得Orchard立即崩溃,因为它无法再访问其数据库等内容。

我们可以讨论这个决策的明智性,但最重要的是,Orchard需要写入权限,而web publishing坚持删除该权限,这破坏了网站。很不好。每次我发布时都必须登录服务提供商的控制面板并重置权限,这使得此过程变得不太自动化。

那么,如何让Web Publishing保留ACL?我在解决方案中找不到任何设置。


这应该真的是发布设置中的一个选项,但Web Deploy文档非常零散。 - Matt McCabe
2个回答

19

您可以通过将以下内容添加到.pubxml文件来添加关闭ACL设置功能:

    <IncludeSetACLProviderOnDestination>False</IncludeSetACLProviderOnDestination>

请查看http://msdn.microsoft.com/en-us/library/ff398069.aspx

该文章还提到,你可以通过一个本地的 .wpp.targets 文件来为所有发布配置更改此设置。 如果您使用多个发布配置,请考虑该选项。


有趣 - 这似乎很简单。这种方法与修改.csproj文件的方法有什么区别,就像@Paul建议的那样? - Tim Long
1
编辑发布文件仅更改该发布配置文件的设置。编辑项目文件会更改所有使用任何配置文件进行发布的设置。此外,还有一种方法可以更改Visual Studio文件夹中的目标(或类似)文件,以更改所有项目的此设置,如果我没记错的话,但我不记得在哪里可以找到它。 - Paul Devenney
我在答案中提供的文档还提到了 .wpp.targets 文件 -- 创建该文件并将此设置放入其中是另一种选择,如果您想要使此设置适用于所有配置文件而不仅仅是选定的配置文件。 - tdykstra
1
我发现很难选择哪个答案作为接受的答案,因为它们都基本上提出了相同的修复方案。最终我选择了这个答案,因为它似乎更简单、更灵活,并提到了.wpp.targets文件,我最终使用了它,并且我的后续问题得到了回答。谢谢! - Tim Long
有没有更友好的用户界面解决方案?(例如,Visual Studio 扩展或工具,可以在不卸载项目 - 编辑 - 重新加载的情况下轻松配置此项) - Demetris Leptos

2
在使用Web Deploy发布项目后,您可能会发现ASPNet IUSR无法写入根目录或其中任何文件(除了App_Data)。默认情况下,Web Deploy将ASPNet IUSR的ACL设置为只读。为了在发布应用程序时防止出现问题,您需要找到项目文件并进行一些更改。对于使用Visual Basic编写的应用程序,项目文件将以.vbproj扩展名结尾,对于使用C#编写的应用程序,项目文件将以.csproj扩展名结尾。在项目文件中找到:
<propertygroup condition=" '$(Configuration)|$(Platform)' ==
'Release|AnyCPU' "></propertygroup>

并将其更改为:

<propertygroup condition=" '$(Configuration)|$(Platform)' ==
'Release|AnyCPU' ">
<includesetaclproviderondestination>False</includesetaclproviderondestination>
</propertygroup>

这将确保Web Deploy不会修改ACL。如果您已经部署到第三方托管提供商,您可能需要联系他们以重置权限,然后再进行另一次部署。

网站功能正常 - 幸运的是,托管提供商让我在控制面板中启用写入权限。 - Tim Long
有趣 - 这似乎很简单。这种方法与修改.pubxml文件的方法有什么区别,就像@tdykstra建议的那样? - Tim Long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接