如何

2014-01-28 11 views
2

我使用時在Visual Studio中的Web服務補充說,有冗餘的數量驚人的一些Web服務開始處理在Web服務中使用多餘的類2012這裏有兩個WSDL文件演示此:如何

http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl

http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl

這些服務創建一個新的會話,並分別將其關閉。每個服務都有自己的MessageHeader類,而該類又有一個MessageData類,該類在每個生成的代理中都進行了重新定義。還有其他人喜歡這個,但我不會將它們全部命名。

這使得我很難創建一個幫助函數來設置我的請求並填充信封中的所有常見信息,例如時間戳,身份驗證等,因爲Service1.MessageHeader與Service2不是同一類型.MessageHeader。我已經嘗試過用鴨子打字,但據我所見,這種嵌套的性質會阻止這種方法。

綜觀WSDL,這些類都被定義爲來自同一命名空間之中。換句話說,在這兩個WSDL中,MessageHeader被定義爲:

<xsd:import namespace="http://www.ebxml.org/namespaces/messageHeader" schemaLocation="msg-header-2_0.xsd"/> 
... 
<part name="header" element="eb:MessageHeader"/> 

有一些方法,使VS明白,這些都是同樣的事情在兩個類中並以某種方式得到它的他們共同分離出兩害麼?或者它是「一個Web服務是一個島嶼」?我真的寧願不必爲我需要的每種類型的Web服務創建單獨的代碼,因爲遠不止這兩個。但他們每個人都使用這些相同的類。

我想過要手動進入代理類。但除了我擔心這會讓VS漏掉一些裝備,因爲我弄糟了它在幕後做的事情,它從來沒有預料到我會鼓搗過,如果WSDL中發生了一些變化,我會失去整個自動生成的功能需要重新同步。

我無論是在C#和OXYGENE嘗試這樣做,遇到同樣的問題。我想在VS下的其他語言中它是一樣的。這似乎與它如何理解WSDL有關。

有人問之前,我不能改變對實際的Web服務的東西。那是另外一家公司,而不是那些有興趣根據我的想法重新設計他們廣泛使用的系統的公司。

+0

您是使用Web引用還是服務引用?如果是後者,那麼你可以嘗試點擊高級菜單上的「分享類型」。 –

+0

我通過添加服務引用添加它,所以後者。你是否指「從引用程序集中重用類型」選項?我已經檢查了兩者。你用這兩個例子試過了嗎?我不確定這是否對這個問題沒有任何作用,或者是因爲他們編寫xsd的方式而不起作用。我確實發現了一些WSCF.blue可能是一個很好的選擇,但還沒有嘗試過。 – jep

回答

2

我發現了一個潛在的解決方案,它可以用我能說的每一種方式工作。但我接受批評或「更好的方式」(包括從GUI中更好的方式)。

我發現,使用以下命令生成適當的「單個單元」類型的接口我想與所有類型的共享:

wsdl.exe /sharetypes /language:CS "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl" "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl" /o:"SabreWebServices.cs" /n:SabreWebServices 

,創建一個C#之一。對於OXYGENE,我用:

wsdl.exe /sharetypes /language:OXYGENE "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl" "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl" /o:"SabreWebServices.pas" /n:SabreWebServices 

FWIW,我用WSDL從"c:\Program Files\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools目錄我的機器上。

我增加成品包裝紙文件到我的應用程序和它的工作完美,如果有點不同於創建通過添加服務引用的包裝。我其實更喜歡這個創建更多的語法。它也有創造只有一個文件而不是衆多的,而不是與應用程序混搭的好處。配置。如果您想更改端點,則可以設置您實例化的任何服務的Url屬性。

我通過this post來到this post這個解決方案。