2009-04-28 53 views
3

我正在使用以Java編寫並使用Apache Axis 1.3的第三方Web服務。該服務有許多超載操作。當WCF Svcutil生成代理時,它通過在操作名稱後附加一個數字來重命名重載操作。例如:WCF:Svcutil生成無效的客戶端代理,Apache AXIS Web服務,過載操作

getDataResponse getData(getDataRequest request); 

getDataResponse1 getData1(getDataRequest1 request); 

這本身不是問題,但是當SvcUtil工具生成請求/響應消息,它忽略改變MessageContracts的WrapperName屬性。

[MessageContractAttribute(
     WrapperName = "getData", 
     WrapperNamespace = "http://namespace.com", 
     IsWrapped = true)] 
    public partial class getDataRequest1 { .. } 

當客戶端應用程序試圖打開代理,下面的異常被拋出:

出現InvalidOperationException:RPC 消息getDataRequest1操作 getData1有一個無效的身體名 的getData。它必須是getData1

如果我改變WrapperName =「getData1」但是,代理將打開,...

  1. 我無法調用操作,因爲服務不承認「getData1」
  2. 服務有近1100的操作,其中近一半是重載

有什麼辦法來產生和/或修改代理,以便所有操作與WCF工作?

馬克

+0

@Mark:你有沒有在http://connect.microsoft.com/visualstudio/上向微軟報告過? – 2009-08-01 01:59:03

+0

不,我沒有,但我會。謝謝! – 2009-08-01 10:56:03

+0

也許這畢竟不是一個很糟糕的問題? :-) – 2009-08-01 10:56:58

回答

1

我能找到的唯一解決方法是手動編輯生成的代碼並刪除所有不需要的重載。

0

編寫一個腳本,會做這個文本修訂,並將其設置爲您的代理庫生成後腳本。

1

之前我沒有看到這個問題,因爲你有一個「java」標記,而我忽略了Java問題。你的問題不是約爲 Java,所以不應該有一個「java」標籤。

svcutil不重命名重載操作。那是因爲沒有重載操作這樣的事情。 WSDL沒有兩個具有相同名稱的操作的概念,但使用不同的消息。

如果你看看來自Axis的WSDL,我相信你會發現操作有附加到他們的數字。


更正:在評論,Mark Good正確地指出,WSDL 1.1確實允許超載。我碰巧認爲它在基於RPC的服務的上下文中是有意義的,其中消息名稱可用於區分一個過載和另一個過載。

不過,他可能不知道的是操作符重載被禁止WS-I Basic Profile 1.1

4.5。3特色操作

配置文件不允許操作名稱在wsdl:portType中重載。

R2304提供姓名屬性在說明wsdl:portType必須有操作用不同的值。

請注意,此要求僅適用於給定wsdl:portType內的wsdl:operations。 A wsdl:portType可能有wsdl:operations,其名稱與其他wsdl:portTypes中的名稱相同。


如果您更多地閱讀WS-I BP1.1,可以瞭解爲什麼WSDL 1.1中的所有內容都不是一個好主意。

4

對於它的價值(4年後),似乎通過手動呼叫WSDL.exe並傳遞/protocol:SOAP參數,可以避免此問題。通過UI生成服務客戶端似乎仍然會導致此問題從VS2012開始,由Apache Axis生成的服務。

實例:

c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools>wsdl /l:cs /protocol:SOAP http://rxnav.nlm.nih.gov/RxNormDBService.xml /out:c:\drop\rxnavapi.cs 

編輯:sphinxxx正確地指出的是,SOAP協議選項在UI公開爲 「Add Web Reference」,所以執行wsdl.exe直接是沒有必要的。

0

我發現使用「老式」AddServiceReference時,即使在VS2012中,它也能正確生成帶重載的類。

0

這裏沒有解決方案爲我工作。

生成針對.NET2的vs2010項目中的引用,然後在針對.NET4的vs2012或vs2013中打開該解決方案,但確實可行。