2009-12-14 90 views
1

我有一个ASP.NET服务器,提供其客户端作为MSI下载(类似于CCNet/CCTray)。 可以有多个服务器(例如,用于开发/测试/生产,但可能有不同的生产实例)。嵌入提供服务器URL到MSI

所以客户端必须知道服务器的URL。我不能要求用户输入URL,因为它对他们来说没有什么意义,他们也不知道任何其他服务器。所以MSI应该包含服务器URL。

现在,我可以预先为不同的环境构建不同版本的MSI(因为这些开发/测试已经有了不同的构建步骤),但这并不能解决产品已经构建的多个产品的问题。

所以我认为服务器应该修改MSI并在提供之前添加正确的URL。没有重建msi可能吗?什么是最简单的方法来实现这一点?

回答

2

基本上是一个MSI文件只是一个数据库,使用Windows Installer API,您可以在此数据库上运行任意SQL ...例如:

Dim installer, database, view, result 
Set installer = CreateObject("WindowsInstaller.Installer") 
Set database = installer.OpenDatabase ("setup.msi", 1) 
Set view = database.OpenView ("INSERT INTO Property (Property, Value) VALUES ('URLPROPERTY', 'http://some.server/blah/service')") 
view.Execute 
database.Commit 
Set database = nothing 

在生成后或预只要使用这个脚本-download过程中,你会进行排序:)

欲了解更多信息和其他(更好的)示例脚本,请参阅Windows SDK

+0

谢谢,就是这样。有一个问题,我应该在视图上调用Close吗? – 2009-12-15 07:37:19

+0

我会检查文档,它会出现view.Close在视图被销毁时被内部调用... http://msdn.microsoft.com/en-us/library/aa372501(VS.85).aspx – saschabeaumont 2009-12-15 22:07:32

0

我不知道修改MSI本身的方法,但可以让服务器将URL写入客户端上的已知文件,并让MSI项目读取该文件(并将其删除)。这样你可以为所有服务器建立一个MSI版本。

+0

那么,但这个文件如何到达客户机?假设客户端机器是某个用户的工作站,他希望尽可能减少点击次数来设置他的东西。 – 2009-12-14 22:38:37

0

修改MSI文件的Web服务器上的服务是不是一个好主意了。如果有人在更新文件时请求文件,该怎么办?

您最好修改构建过程以生成一组与生产网站相对应的MSI文件。每个网站都有自己的自定义MSI文件。

+0

那么,我可以在application_start中修改它,例如,所以这不是问题。 – 2009-12-15 07:38:15

+0

当然,绝对不要修改一个可下载的活动文件..你会从另一个页面提供它 - 收到请求,复制,更新副本,提供服务,销毁它。 – saschabeaumont 2009-12-15 22:09:53