簡體   English   中英

如何從遠程源配置ASMX Web服務URL

[英]How to configure ASMX web service URL from remote source

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

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

必須有一個更好,更清潔,更安全的解決方案-還是有?

順便說一句,我們的應用程序在.NET 2.0上運行,在可預見的將來,我們不會遷移到該平台的較新版本。

Visual Studio生成的Refernce.cs文件指示將從設置中檢索Web服務的URL:

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

我相信約翰·桑德斯John Saunders )在他的評論中給了您一個很好的建議。 您需要一個SettingsProvider該類

...定義用於存儲在應用程序設置體系結構中使用的配置數據的機制。 .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; } 

正如您在代碼中看到的那樣,為了做到這一點,您需要知道在添加對Web服務的引用( ConsoleApplication1_net_webservicex_www_BarCode )時在app.config中添加的設置名稱和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 ,以獲得正確的配置值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM