2010-11-09 27 views
0

我試圖創建一個C#類,它可以調用相同類上的相同方法,但類可以來自兩個不同的Web服務引用。我正在訪問SomeWebServiceSomeWebServiceAlt,它們具有相同的類別,但位於不同的服務器上。我們的目標是能夠首先嚐試使用SomeWebService中的方法,並且如果那一個假髮退出,請嘗試SomeWebServiceAlt。我希望有一種訪問任何Web服務的泛型類,但是我遇到了類型約束的問題,因爲沒有任何公共接口或基類用於我在兩個引用中使用的不同類。也就是說,我使用SomeWebService名稱空間和SomeWebServiceAlt名稱空間中的ConnectionClass,但兩個ConnectionClass類不被C#認爲是相關的,因此我不能只說where TClass : CommonBaseClassAcrossWebServices。我應該怎麼做?我結束了重複代碼和做:在C#中的兩個Web服務引用中訪問相同的類

if (typeof(SomeWebService.ConnectionClass) == typeof(TConnection)) 
{ ... } 
else if (typeof(SomeWebServiceAlt.ConnectionClass) == typeof(TConnection)) 
{ ... } 

這似乎真的多餘和骯髒。我使用的是.NET 3.5,但我無法控制這兩個Web服務。這是我在這裏看到的問題和類似問題之間的差異:其他人可以控制Web服務。

我覺得我的解決方案最終會使用反射以某種方式檢查並查看預期的方法是否存在,然後在我正在使用的任何Web服務的類上調用該方法。

+0

你使用的是WCF。如果這樣看待共享DLL中的對象,那麼在app.config的Contract中,確保兩個服務使用相同的DLL – dbones 2010-11-09 19:44:11

回答

2

如果它們共享相同的服務定義,則可以使用相同的引用,只需在運行時更改主機即可。

+0

我不知道我能否保證他們會有相同的服務定義。如果我可以,我將如何在運行時更改主機?在VS 2008中,我將一個Web引用添加到我的項目中,並且該引用具有主機URL。這看起來像編譯時的事情,因爲它是。 – 2010-11-09 19:50:43

+0

他是對的。您不需要兩個Web引用或服務引用。使用一個,並在運行時更改Url。如果你只有一個參考,你顯然只會有一組類。 – 2010-11-09 19:53:34

+0

找到本教程:http://www.codeproject.com/KB/XML/wsdldynamicurl.aspx現在就試試這個 - 謝謝! – 2010-11-10 18:19:52

0

如果您使用的是Web引用,那麼您的運氣不好。

使用服務引用,您可以告訴它重用這些數據類型。然後您必須確保您的使用應用程序可以訪問數據類型。

+0

如何將Web引用轉換爲服務引用? – 2010-11-09 19:51:56

+0

不要轉換它。只需使用「添加服務參考」並擺脫Web引用,並且永遠不要再使用它們。 – 2010-11-09 19:52:46

+0

正如Albin所建議的,我能夠在運行時動態更改Web服務參考URL。有沒有理由不使用網絡引用? – 2010-11-10 21:04:05

0

我知道這是舊的,但我一直在這裏回來。我想調用一個在客戶端可以命名爲不同的Web服務,不同的服務名稱和不同的服務端點,但下面是同樣的合同。我不需要動態確定任何東西,只需從不同的名稱/端點調用即可。答案在這裏,但很難理解。 1.當您將它附加到您的項目時,您應該將其設置爲服務引用而不是Web引用。只附加一個版本。
2.在運行時,也許從應用程序設置中,您可以將服務的端點替換爲具有相同合同但名稱不同的服務的端點。
svc2.Endpoint.Address = new System.ServiceModel.EndpointAddress(WebConfigurationManager.AppSettings [「client_service_endpoint」]。ToString());

這將在不同的服務名稱上調用不同端點上的其他Web服務。

乾杯!