2010-03-02 54 views
17

構建一個依賴具有非常詳細的SOAP服務集的第三方提供者的應用程序(我們正在討論50多個WSDL文件)。但是每個單獨的WSDL都有大量的共享類型聲明。使用wsdl.exe生成客戶端代碼時,曾經有一個/ sharedtypes標誌,如果發現多次類型,則會合並重復條目。/共享類型相當於svcutil.exe?

當我嘗試生成我的客戶端代碼時,我對第三方在其所有WSDL文件中包含的這些重疊類型進行了炸彈轟炸。

svcutil /t:code /importxmltypes [mypath]/*.wsdl 

結果在錯誤信息中暗指類型衝突。例如,下面的錯誤消息的幾個示例:

Error: There was an error verifying some XML Schemas generated during export: 
The simpleType 'http://common.soap.3rdparty.com:CurrencyNotation' has already been 
declared. 

Error: There was an error verifying some XML Schemas generated during export: 
The complexType 'http://common.soap.3rdparty.com:NumberFormat' has already been 
declared. 

我無法控制WSDL的輸出。我不想手動編輯WSDL,因爲擔心在運行時出現的錯誤會很難追溯到我們編輯WSDL文件。更不用說,有50個WSDL文件,範圍從200到1200行XML。 (再次提醒我,爲什麼我們認爲SOAP是偉大的拯救我們大家早在90年代末?)

回答

2

嘗試在一個命令中指定所有的WSDL:

svcutil http://example.com/service1?wsdl http://example.com/service2?wsdl ... 

這應自動照顧重複類型。另一種選擇是採取看看/reference命令開關:

/reference:<file path>  - Add the specified assembly to the set of 
           assemblies used for resolving type 
           references. If you are exporting or 
           validating a service that uses 3rd-party 
           extensions (Behaviors, Bindings and 
           BindingElements) registered in config use 
           this option to locate extension assemblies 
           that are not in the GAC. (Short Form: /r) 

這意味着,如果你已經在一些彙編定義某些類型的,你可能會包含此程序集和svcutil將排除類型由它來避免重複:

svcutil /reference:someassembly.dll http://example.com/service?wsdl 
+1

所有的wsdls都是本地的,但那不是重點。我的問題不是我無法傳入多個.wsdl文件。問題在於源在每個wsdl文件中包含多個數據類型(或者幾個,如果不是全部的話)。例如,瀏覽我打開的前6個wsdls,看起來5有一個名爲CurrencyNotation的類型的ComplexElement條目。當svcutil試圖解析我所有的wsdls時,它說,哦,嗨,currencyNotation已經存在,SO SORRY。繁榮。 – bakasan 2010-03-02 08:05:28

+0

所以你說單獨輸入每個wsdl路徑的行爲與* .wsdl(所有wsdl都駐留在本地)的行爲不同。由於這是我們代理的第一代,所以我實際上沒有可以引用的程序集。策略是解析一個wsdl,編譯爲dll,然後引用它作爲下一個?解決笨蛋,然後沖洗並重復休息? – bakasan 2010-03-02 08:10:25

+2

沒有完全準備好輸出所有50個以上wsdl文件的路徑,但只有兩個測試,svcutil foo.wsdl bar.wsdl被轟炸出來,並具有相同的重複類型消息。在幾年前處理了wsdl.exe的w/pain之後,看到svcutil.exe在這個年代並沒有顯得好多了,這並不令人感到欣慰。 :P – bakasan 2010-03-02 08:16:50

0

我有類似的問題。通過爲不同的xml命名空間定義不同的CLR命名空間(使用svcutil的/ namespace參數),我能夠得到它的工作。

/namespace:http://www.opengis.net/gml,OpenGIS.GML 
0
我一直在使用Wsdl.exe用,以避開這個,因爲我與不同的終端定義相同的數據傳輸對象的一些SOAP Web服務工作

。所以我使用wsdl.exe,因爲它具有共享類型開關。我不是WPF開發人員,所以我並不在意輸出沒有實現對WPF的任何內容,但生成的類都是部分的,所以你可以做一些工作來實現你在單獨文件中關心的接口。