我有引用Web服務的代碼,並且我希望該Web服務的地址是動態的(從數據庫,配置文件等中讀取),以便輕鬆更改。其中一個主要用途是部署到機器名稱和IP地址不同的多個環境。所有部署中的Web服務簽名都是相同的,只是位於其他地方。如何在.NET中動態切換Web服務地址而無需重新編譯?
也許我剛剛被Visual Studio「添加Web引用」嚮導所迷惑 - 看起來這應該是相對容易的事情。
我有引用Web服務的代碼,並且我希望該Web服務的地址是動態的(從數據庫,配置文件等中讀取),以便輕鬆更改。其中一個主要用途是部署到機器名稱和IP地址不同的多個環境。所有部署中的Web服務簽名都是相同的,只是位於其他地方。如何在.NET中動態切換Web服務地址而無需重新編譯?
也許我剛剛被Visual Studio「添加Web引用」嚮導所迷惑 - 看起來這應該是相對容易的事情。
當您生成Web引用並單擊解決方案資源管理器中的Web引用時。在屬性窗格中,您應該看到這樣的事情:
更改值動態將投入你的app.config一個條目。
這裏是CodePlex article有更多的信息。
將URL行爲更改爲「Dynamic」。
如果您從數據庫中提取URL,則可以手動將其分配給Web服務代理類URL屬性。這應該在調用Web方法之前完成。
如果您想使用配置文件,可以將代理類URL的行爲設置爲動態。
只要Web服務方法和底層暴露的類不會改變,它就相當簡單。使用Visual Studio 2005(及更新版本),添加Web引用會創建具有此URL的app.config(或web.config,適用於Web應用程序)部分。您只需編輯app.config文件以反映所需的URL。
在我們的項目中,我們的簡單方法是僅針對每種環境類型(開發,測試,生產)評估app.config條目。所以我們只取消註釋所需環境類型的條目。那裏不需要特殊的編碼。
只是一個關於靜態和動態差異的說明。
如果你真的動態地設置它,你應該設置你正在調用的代理類實例的.Url字段。
在你的程序中設置的config文件中值:
是一個爛攤子;
直到下一個應用程序啓動纔可能被讀取。
如果只是每次安裝需要完成一次,我會同意其他海報並使用.config文件和動態設置。
絕對使用Url屬性是最好的選擇。是否將其設置在app.config,數據庫或第三個位置取決於您的配置需求。有時,當您更改Web服務位置時,您不希望應用程序重新啓動。您可能沒有負載平衡器縮放後端。您可能會熱補丁一個Web服務錯誤。你的實現也可能有安全配置問題。無論是生產數據庫用戶名和密碼,甚至是安全認證信息。適當的責任分離可以讓你進入更多涉及的配置設置。
如果圍繞代理生成的類添加包裝類,則可以在每次創建包裝類調用Web方法時以某種統一的方式設置Url屬性。
我已經爲這個問題奮鬥了幾天,最後點擊了燈泡。能夠在運行時更改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;
}
}
}
}
開放孤子探險
右鍵單擊Web服務改變URL行爲來動態
點擊「顯示所有文件」解決方案資源管理
圖標在Web引用編輯參考.cs文件
更改構造器
public Service1() {
this.Url = "URL"; // etc. string variable this.Url = ConfigClass.myURL
}
對我來說是引用到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>
我知道這是一個老問題,但我們的解決方案比我在這裏看到的要簡單得多。我們將它用於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();
}
您使用的是Visual Studio 2005或2008。我相信每個嚮導都略有不同。 – 2008-09-24 04:22:29