2013-02-01 20 views
1

我們正在開發一個傳統的C#企業應用程序。它的客戶端使用多種Web服務,其URL和許多其他設置都從本地app.config文件中讀取。我們希望將這些設置遷移到全局數據庫中以簡化其管理。但是,我無法弄清楚如何(以及是否)可以遷移Web服務URL。這些都是從VS生成的服務客戶端代碼中讀取的,我似乎無法找到一種方法告訴VS使用與Settings.Designer.cs中生成的設置提供程序不同的設置提供程序。如何從遠程源配置ASMX Web服務URL

我們可以覆蓋服務門面的Url屬性與我們想要的值,它被創建 - 這是目前在代碼中的幾個地方使用的解決方案。但是,我不想觸及使用任何這些服務(現在和未來)的代碼庫的每個部分。更少我想修改生成的代碼。

必須有更好,更清潔,更安全的解決方案 - 或者有嗎?

Btw我們的應用程序運行在.NET 2.0上,我們不會在可預見的未來遷移到更新版本的平臺。

+3

看來您需要一個[Settings Provider](http://msdn.microsoft.com/en-us/library/system.configuration.settingsprovider.aspx),它可以使用數據庫來存儲設置。 –

+0

@John,看起來確實如此。我怎麼能告訴VS在生成的Web服務客戶端代碼中使用我的SettingsProvider? –

+1

@PéterTörök也許這些鏈接有助於http://www.codeproject.com/Articles/20917/Creating-a-Custom-Settings-Provider和http://msdn.microsoft.com/en-us/library/8eyb2ct1.aspx和http://www.codeproject.com/Articles/136152/Create-a-Custom-Settings-Provider-to-Share-Setting – Yahia

回答

1

是由Visual Studio生成的Refernce.cs文件表示web服務的URL將設置檢索:

this.Url = global::ConsoleApplication1.Properties. 
    Settings.Default.ConsoleApplication1_net_webservicex_www_BarCode; 

我相信John Saunders給了你在他的評論精彩的建議。你需要一個SettingsProvider class其中:

...定義存儲在 應用程序設置架構使用的配置數據的機制。 .NET Framework包含一個 單一默認設置提供程序LocalFileSettingsProvider,其中 將配置數據存儲到本地文件系統。但是,您可以通過從摘要 SettingsProvider類派生 創建備用存儲機制。包裝類使用的提供程序是 ,通過使用 SettingsProviderAttribute裝飾包裝類來確定。如果未提供此屬性,則使用默認的LocalFileSettingsProvider。

我不知道你有多少進步以下這種方法,但它應該很簡單明瞭:

  1. 創建SettingsProvider類:

    namespace MySettings.Providers 
    { 
        Dictionary<string, object> _mySettings; 
    
        class MySettingsProvider : SettingsProvider 
        { 
         // Implement the constructor, override Name, Initialize, 
         // ApplicationName, SetPropertyValues and GetPropertyValues (see step 3 below) 
         // 
         // In the constructor, you probably might want to initialize the _mySettings 
         // dictionary and load the custom configuration into it. 
         // Probably you don't want make calls to the database each time 
         // you want to read a setting's value 
        } 
    } 
    
  2. 擴展類項目的YourProjectName.Properties.Settings部分類的定義和裝飾SettingsProviderAttribute

    [System.Configuration.SettingsProvider(typeof(MySettings.Providers.MySettingsProvider))] 
    internal sealed partial class Settings 
    { 
        // 
    } 
    
  3. 在重寫GetPropertyValues方法,你必須從_mySettings字典得到映射值:

    public override SettingsPropertyValueCollection GetPropertyValues(
        SettingsContext context, 
        SettingsPropertyCollection collection) 
    { 
        var spvc = new SettingsPropertyValueCollection(); 
        foreach (SettingsProperty item in collection) 
        { 
         var sp = new SettingsProperty(item); 
         var spv = new SettingsPropertyValue(item); 
         spv.SerializedValue = _mySettings[item.Name]; 
         spv.PropertyValue = _mySettings[item.Name]; 
         spvc.Add(spv); 
        } 
        return spvc; 
    } 
    

正如你可以在代碼中看到,爲了做到這一點,你需要要知道設置名稱,因爲它是在app.config,當你已經添加了參考Web服務(ConsoleApplication1_net_webservicex_www_BarCode)的Settings.settings補充說:

<applicationSettings> 
    <ConsoleApplication30.Properties.Settings> 
     <setting name="ConsoleApplication1_net_webservicex_www_BarCode" 
      serializeAs="String"> 
      <value>http://www.webservicex.net/genericbarcode.asmx</value> 
     </setting> 
    </ConsoleApplication30.Properties.Settings> 
</applicationSettings> 

這是一個非常簡單的例子,但是您可能會使用更復雜的對象來存儲配置信息,以及上下文中可用的其他屬性,例如item.Attributescontext以獲得正確的配置值。

+0

謝謝亞歷克斯,這真的清除了事情!由於可悲的事實,我迄今爲止發現的材料是矛盾的和/或根本不正確的,所以我一整天都在努力嘗試和失敗,以使我的設置提供者工作。你上面的第二步是我在其他地方找不到的關鍵。它已經贏得了你的賞金,但我只能在明天... ...獎勵它 –

+0

@PéterTörök,我很高興它有幫助。祝你好運! –