2009-02-05 62 views
3

我一直在嘗試閱讀如何在.net中正確執行配置,並遇到了一些我覺得有點奇怪的問題,那就是配置設置通過Settings類編譯到程序集中。刪除app.config並運行應用程序不會像我期待的那樣導致配置錯誤,但現在我無法替換配置值。爲什麼.net配置設置被編譯成程序集?

在我的應用程序中,我有一個web服務url的配置設置,我需要能夠以編程方式獲取和設置。我應該在配置中爲我的應用程序創建自定義部分,我將通過ConfigurationManager.GetSection(..)讀取以觸發配置文件的讀取,或者有另一種解決此問題的方法,因爲我絕對不希望webservice url用於將ws代理生成爲可能泄漏到生產環境中的網址。

請幫忙。

回答

0

如果你點擊了再加上屬性,然後在德的設置,你會發現一個名爲settings.designer.cs

此文件包含您在定義應用程序設置時所創建的默認值,這就是爲什麼你的應用程序沒有配置文件的原因。

但是,您始終可以覆蓋此值。

您唯一的測試方法是創建一個對公共消費安全的默認值,並在測試期間對其進行更改。

+0

在我的情況沒有爲web服務URL「安全」爲大衆消費沒有價值。我有dev,stage,prod webservices,因此如果沒有在配置文件中設置,我希望應用程序拋出一個configurationerrorsexception,而不是使用我用來創建代理的開發人員ws url。 – Fadeproof 2009-02-05 12:48:33

0

當您添加對web服務的引用時,可以將該屬性設置爲使webservice url爲動態(即從配置文件中讀取)。

點擊「Web參考」。點擊您的網絡服務,並將屬性「網址行爲」從「靜態」設置爲「動態」。

一旦進行了更改,您只需將web服務指向正確的URL即可在應用程序運行之前更改配置文件。

+0

我所有的webservice引用都設置爲URL Behavior = Dynamic,它可以正常工作。這仍然不能解決最初陳述的問題。如果我在構建初始url後刪除了配置文件,仍然從編譯到程序集的Settings中獲取。 – Fadeproof 2009-02-05 12:46:06

+0

限制您的開發Web服務的IP地址範圍,以便只有您的開發機器可以與它交談。然後,如果配置文件在安裝應用程序後被刪除,則至少應用程序在嘗試連接時會失敗。我唯一知道的另一種方法是手動生成代理並進行修改。 – tvanfosson 2009-02-05 12:52:32

1

嘗試將應用程序配置文件添加到您的項目而不是設置文件。應用程序配置文件不會被編譯到程序集中。

0

據我記得(我立場糾正),.Net創建一個配置文件,存儲在您的Windows應用程序數據文件夾中,尤其是如果您正在部署應用程序。

在應用程序數據(C:\ Documents and Settings \ yourusername \ Local Setting \ Application Data \ your app name)中搜索並查看是否可以在其中找到應用程序配置。如果是這樣,您應該可以更改它那裏。

另外我不知道你正在創建什麼類型的Web服務,但是你應該不是使用web.config(它是我使用的)來存儲設置?

0

據我所知web服務引用邏輯規定,如果在app.config(或web.config)中存在某個鍵,它會選擇...如果不是的話......它將使用URL引用用於創建web服務參考。在Framework 1.1中可能是2.0。

至少將框架3.0中的Settings.settings文件用作默認值。如果您在web.config中沒有提供重寫Settings.settings中的密鑰,它將使用默認值...並且這就是爲什麼您看不到配置錯誤的原因。在webservice引用的情況下,在該文件中存儲您提供用於創建引用的值。

正如我所看到的... Settings.settings允許您以編程方式更新密鑰,以保存偏好和一些如何保持。

More info:

0

我想我明白你在說什麼,Jojoe。假設您從www.productionurl.com添加一個webservice,生成的代理類將生產url保留在源代碼中。在運行時,如果它無法在配置文件中找到url的值(如果您已將該服務設置爲動態),則會使用此默認值。

如果你不喜歡這種行爲,你有2種選擇:

  • 變化Reference.cs文件(你必須繼續這樣做,只要你刷新服務代理)
  • 創建代理的部分類並覆蓋URL設置

或者您可以檢查web服務是否有開發網站。如果是這樣,請從該站點而不是生產站點創建Web引用。