【问题标题】:Create a new website when installing web services安装 Web 服务时创建新网站
【发布时间】:2013-10-03 08:59:35
【问题描述】:

我正在尝试为我的 Web 服务项目添加一个 Web 设置项目,以使最终用户能够更轻松地进行相当复杂的安装。但是默认设置妨碍了我,我不知道如何调整它们。

我的要求是:

  1. 创建新网站和应用程序池
  2. 创建新的应用程序池时,需要设置为 .Net 4,经典模式,用户可选择用户帐户来运行应用程序池
  3. 将 Web 服务安装到 C:\Program Files\<comapany name>\Services 文件夹下的自定义路径以满足公司标准
  4. 创建一个 SQL 数据库,将登录和 db_datawriter 角色添加到为应用程序池选择的帐户
  5. 运行 SQL 语句构建初始数据库

似乎可以通过自定义操作创建 SQL 数据库和登录(4 和 5),因为我将在安装时运行我的代码。但是默认情况下,Web 设置项目只允许用户从现有网站和应用程序池(1 和 2)中进行选择,并且似乎不允许我自定义此过程,除非添加图像,这也意味着使用选定的网站。

一个选项是在安装之前创建一个合适的网站和应用程序池,如果它未使用,则将其删除,然后用户只需选择我为他们创建的网站/应用程序池(不理想但..) 但是我没有预先安装步骤来附加这样的自定义代码,而且我不确定如何以可靠和编程方式与 IIS 交互。

任何人都可以建议我创建上述安装程序的最佳方法,因为我认为 Web 设置项目不适合现阶段的目的,但不希望浪费一天时间学习 WIX 或 NSIS。

【问题讨论】:

  • 如果你要[-1]我,请发表评论,这样我就有机会复出! (或者也许了解我对本网站的误用)这不是一个广泛的问题,我有一些我想在不改变技术的情况下实现的特定要求(即:如类似的 SO 帖子所建议的那样,对于 WiX 或 NSIS)。
  • 你有5个问题,你说它不广泛?

标签: web-services iis installation windows-installer setup-project


【解决方案1】:

1 & 3) 无法创建新的应用程序池,因为无法在 Web 设置项目中运行自定义代码预安装,在我的情况下,它被证明是可以接受的用户在安装前在 IIS 中创建网站/应用程序池。如果需要,您可以通过Microsoft.Web.Administration.dll (got the idea from here) 修改现有站点的虚拟目录,方法是将[TARGETSITE] 传递给 CustomActionData,以便找到修改虚拟目录所需的Application 对象。

2) 这是通过引用 Microsoft.Web.Administration.dll (got the idea from here) 并使用它来更改应用程序池属性来实现的,您需要通过添加 @ 将 appPool 名称传递给自定义操作987654328@ 到 CustomActionData 的 CustomAction。

仅供参考 - 您可以传递给 CustomActionData 的可用属性是 documented here,但不完整(例如,不包括 [TARGETAPPPOOL] 和 [TARGETSITE])

我用这段代码修改了应用程序池:

Microsoft.Web.Administration.ServerManager serverManager = new ServerManager();
var appPoolName = base.Context.Parameters["AppPool"].ToString();
var appPool = serverManager.ApplicationPools.SingleOrDefault( pool => pool.Name == appPoolName );
appPool.ManagedRuntimeVersion = "v4.0";
appPool.ManagedPipelineMode = ManagedPipelineMode.Classic;
serverManager.CommitChanges();

4 - 5) 只需通过自定义操作打开 SQL 连接并运行相关 SQL 脚本,您将无法添加真实帐户,即:NT AUTHORITY\NETWORK SERVICENT AUTHORITY\ANONYMOUS ,但可以使用 IIS 创建的虚拟用户帐户IIS APPPOOL\<app pool name>

【讨论】:

  • 有了这样一个可怕的解决方案,微软在 VS2012 中将这个项目类型踢到路边应该是显而易见的。使用 WiX 或 InstallShield,您无需编写任何自定义操作或要求最终用户执行手动步骤即可完成所有这些操作。
  • 很抱歉,如果我以某种方式冒犯了您,非常具体地表示不想更改为 WiX、NSIS 或 InstallShield,因为我会浪费太多时间。您能否就如何改进我的答案/解决方案提供一些指导?
【解决方案2】:

如果您需要开发复杂的安装程序,但不想花一天时间学习安装程序技术,那么您最好的选择可能是聘请顾问为您完成。

【讨论】:

  • 我是顾问:S - 我的预算超出了 1/2 天,我最大的问题是找到相关参数(对我来说 AppPool 名称 - [TARGETAPPPOOL])传递给CustomActionData 属性,以便我可以与之交互。当我咳嗽时会发布真正的答案,但是 CustomActionData 的文档记录很差,参数列表在链接中,但它是一个不完整的列表,所以我不得不通过反复试验找到 TARGETAPPPOOL,并放弃添加新的要求应用程序池/网站,原因我稍后会解释msdn.microsoft.com/en-us/library/aa370905.aspx
  • CusotmActionData 的文档记录并不差,您只是从未读过它。延迟执行自定义操作可以提升运行,因此 Microsoft 创建了一个安全模型来防止安全漏洞。 CAD 属性只是从脚本生成传递到脚本执行阶段的数据,由您决定需要传递多少数据以及如何构建数据。 FWIW 我可以在几个小时内编写和测试这个安装程序。但要学会快速做到这一点的技能需要数年时间。
猜你喜欢
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多