2008-09-24 61 views
50

我有引用Web服務的代碼,並且我希望該Web服務的地址是動態的(從數據庫,配置文件等中讀取),以便輕鬆更改。其中一個主要用途是部署到機器名稱和IP地址不同的多個環境。所有部署中的Web服務簽名都是相同的,只是位於其他地方。如何在.NET中動態切換Web服務地址而無需重新編譯?

也許我剛剛被Visual Studio「添加Web引用」嚮導所迷惑 - 看起來這應該是相對容易的事情。

+0

您使用的是Visual Studio 2005或2008。我相信每個嚮導都略有不同。 – 2008-09-24 04:22:29

回答

49

當您生成Web引用並單擊解決方案資源管理器中的Web引用時。在屬性窗格中,您應該看到這樣的事情:

Web Reference Properties

更改值動態將投入你的app.config一個條目。

這裏是CodePlex article有更多的信息。

+1

當我發佈它時,app.config在哪裏去。我無法在發佈輸出目錄 – Shyju 2010-04-22 13:44:33

+2

中看到它,它將被重命名爲[OutputAssemblyName] .config。例如:MyProject。exe.config – 2010-04-24 06:23:21

+2

以下布拉德布魯斯的答案在某些情況下更有幫助 - 您可以更改Web服務對象的Url屬性。 – SAJ14SAJ 2013-02-13 16:12:40

5

將URL行爲更改爲「Dynamic」。

2

如果您從數據庫中提取URL,則可以手動將其分配給Web服務代理類URL屬性。這應該在調用Web方法之前完成。

如果您想使用配置文件,可以將代理類URL的行爲設置爲動態。

4

只要Web服務方法和底層暴露的類不會改變,它就相當簡單。使用Visual Studio 2005(及更新版本),添加Web引用會創建具有此URL的app.config(或web.config,適用於Web應用程序)部分。您只需編輯app.config文件以反映所需的URL。

在我們的項目中,我們的簡單方法是僅針對每種環境類型(開發,測試,生產)評估app.config條目。所以我們只取消註釋所需環境類型的條目。那裏不需要特殊的編碼。

2

只是一個關於靜態和動態差異的說明。

  • Static:每次調用Web服務時都必須設置URL屬性。這是因爲如果Web服務位於代理類構造函數中,則爲基本URL。
  • 動態:將在您的web.config文件中爲您創建一個特殊配置密鑰。默認情況下,代理類將從該密鑰讀取URL。
25

如果你真的動態地設置它,你應該設置你正在調用的代理類實例的.Url字段。

在你的程序中設置的config文件中值:

  1. 是一個爛攤子;

  2. 直到下一個應用程序啓動纔可能被讀取。

如果只是每次安裝需要完成一次,我會同意其他海報並使用.config文件和動態設置。

1

絕對使用Url屬性是最好的選擇。是否將其設置在app.config,數據庫或第三個位置取決於您的配置需求。有時,當您更改Web服務位置時,您不希望應用程序重新啓動。您可能沒有負載平衡器縮放後端。您可能會熱補丁一個Web服務錯誤。你的實現也可能有安全配置問題。無論是生產數據庫用戶名和密碼,甚至是安全認證信息。適當的責任分離可以讓你進入更多涉及的配置設置。

如果圍繞代理生成的類添加包裝類,則可以在每次創建包裝類調用Web方法時以某種統一的方式設置Url屬性。

4

我已經爲這個問題奮鬥了幾天,最後點擊了燈泡。能夠在運行時更改Web服務的URL的關鍵是覆蓋構造函數,我使用了部分類聲明。上面,將URL行爲設置爲動態也必須完成。

這基本上會創建一個Web服務包裝,如果您必須通過添加服務引用重新加載Web服務,那麼您不會失去工作。 Microsoft爲部分類提供的幫助特別指出,此構造的部分原因是創建Web服務包裝。 http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.100).aspx

// Web Service Wrapper to override constructor to use custom ConfigSection 
// app.config values for URL/User/Pass 
namespace myprogram.webservice 
{ 
    public partial class MyWebService 
    { 
     public MyWebService(string szURL) 
     { 
      this.Url = szURL; 
      if ((this.IsLocalFileSystemWebService(this.Url) == true)) 
      { 
       this.UseDefaultCredentials = true; 
       this.useDefaultCredentialsSetExplicitly = false; 
      } 
      else 
      { 
       this.useDefaultCredentialsSetExplicitly = true; 
      } 
     } 
    } 
} 
0

開放孤子探險

右鍵單擊Web服務改變URL行爲來動態

點擊「顯示所有文件」解決方案資源管理

圖標在Web引用編輯參考.cs文件

更改構造器

public Service1() { 
     this.Url = "URL"; // etc. string variable this.Url = ConfigClass.myURL 
     } 
0

對我來說是引用到WebService是

服務引用

無論如何,這很容易。正如有人所說,你只需要改變web.config文件中的URL。

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="YourServiceSoap" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     **** CHANGE THE LINE BELOW TO CHANGE THE URL **** 
     <endpoint address="http://10.10.10.100:8080/services/YourService.asmx" 
      binding="basicHttpBinding" bindingConfiguration="YourServiceSoap" 
      contract="YourServiceRef.YourServiceSoap" name="YourServiceSoap" /> 
    </client> 
6

我知道這是一個老問題,但我們的解決方案比我在這裏看到的要簡單得多。我們將它用於VS2010以上的WCF調用。字符串url可以來自應用程序設置或其他來源。在我的情況下,它是一個下拉列表,用戶選擇服務器。該服務通過VS添加服務引用進行配置。

private void CallTheService(string url) 
{ 
    TheService.TheServiceClient client = new TheService.TheServiceClient(); 
    client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url); 
    var results = client.AMethodFromTheService(); 
} 
相關問題