2009-12-14 89 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