簡體   English   中英

C# Web 服務客戶端:具有相同(復雜)返回類型的多個 Web 服務方法?

[英]C# web-service client: multiple web-service methods with same (complex) return type?

目前,我正在為 Java B2B Web 服務構建客戶端,我想我已經確定了我們已經有很長一段時間的問題的原因。 不幸的是,我無法發布 WSDL。

顯然,我的自動生成的代理代碼(通過 wsdl.exe:由於 WCF 不支持密碼摘要而必須使用 WSE 3.0)無法處理具有多個具有相同返回類型的 Web 服務的 ZE7F674EE60F6AB14C35F6CEB5ZF6 的 Web 服務的 ZE7F674EE60F6AB14C35F6CEB5ZF6。

舉個例子 - 一個定義以下方法的網絡服務:

Public ComplexTypeX Blah();
Public ComplexTypeX Blue();
Public ComplexTypeX Foo();
Public ComplexTypeY Bar();

在我的 Reference.cs 文件中,如果我注釋掉所有調用 Blah()、Blue() 或 Foo() 中任意兩個的代碼,那么剩下的未注釋的方法可以調用沒有問題。 但是,如果我有多個未注釋掉的這三種方法中的一種(例如 Blah() 和 Foo()),那么在實例化Web 服務客戶端代碼時會收到以下錯誤消息:

“方法Blah不能反映。” “來自命名空間' http://some.url '的元素'ComplexTypeX'來自命名空間'XML'元素'ComplexTypeX'引用了使用方法和類型的方法和類型更改的Web方法's根元素。

現在,絕對沒有將ComplexTypeX方法定義為 Web 服務的一部分,所以我只能假設 .NET(或至少 wsdl.exe)不允許您使用返回復雜(用戶定義)的 Web 服務跨多種方法的相同類型的類型...對嗎?

我遇到了類似的問題,這是我發現的:

我已經定義了一個復雜類型作為響應返回:

public class FooResponse {...}

[WebMethod]
public FooResponse Foo() {...}

請注意,此處 Foo/Foo+Response 的確切名稱配對很重要。 當我如下更改方法名稱時,問題就消失了:

public class FooResponse {...}

[WebMethod]
public FooResponse Fooxxx() {...}

我認為正在發生的事情是 .NET 正在嘗試使用名為 FooResponse 的元素自動包裝來自 Foo 方法的響應。 使用與您要返回的 object 相同的名稱會產生歧義。 嘗試更改您的響應名稱 object 或您的方法名稱以避免這種沖突。

我剛剛搜索了“引用方法和類型”,發現了一個連接錯誤報告“ System.InvalidOperationException: The XML element * from namespace * references a references a method and a type ”。 在這種情況下,存在具有完全相同名稱(本地名稱和命名空間)的操作和元素。


值得注意的是微軟的部分回應:

我們不再對 ASMX 進行增強; 我們繼續支持其現有功能,但在可能的情況下,我們建議使用 WCF 代替。

我發現了另一個引發錯誤的案例:這是我的代碼:

[WebMethod]
public CheckUpdateResponse CheckUpdate()
{
...
}

好的,我解釋一下:返回類型CheckUpdateResponse是一個結構體, CheckUpdate()是方法。 因此,在 WSDL .NET 中,在 XML 元素之一中的方法名稱CheckUpdate中自動添加“ Response ”后綴來描述方法的返回值。

等等:它發現了一個重復的元素並給出錯誤“使用 WebMethodAttribute 更改方法的消息名稱......”

解決方案 我將返回類型重命名為“CheckUpdateResult”,現在一切正常!

我希望這會對某人有所幫助!

使用 WSDL.exe 有一個開關 /sharetypes 這應該解決這個問題。

此外,我不同意這是微軟的事情,因為相同的類被暴露為位於多個 wsdl 中的不同復雜類型。 那不是一個好的抽象設計。

共享類型的現成參考 Microsoft 文檔打開類型共享功能。 此功能為不同服務之間共享的相同類型創建一個具有單一類型定義的代碼文件(命名空間、名稱和線路簽名必須相同)。 使用 http:// URL 作為命令行參數引用服務或為本地文件創建 discomap 文檔。

所以我只能假設 .NET(或至少 wsdl.exe)不允許您使用通過多種方法返回相同類型的復雜(用戶定義)類型的 Web 服務......對嗎?

這是不正確的。 想象一下,如果它是真的,那將是多么痛苦——你只能有一個返回 String 的方法,一個返回 Double 的方法,一個返回 SomeObject 的方法,等等……這將是一場噩夢。

我對 .NET 中的 web 服務不是很熟悉,但是從您收到的錯誤來看,您似乎遇到了 XML 命名空間的問題 - 也許存在名稱沖突。 我會嘗試按照錯誤消息中的建議來修改WebMethodAttribute

此外,如果您由於某些公司隱私/敏感性問題而無法發布與您遇到的問題相關的代碼/文檔,您應該發布仍能證明您的測試用例的凈化版本。 幾乎任何“敏感”的東西都應該能夠歸結為更簡單的代碼片段,它仍然可以理解你的觀點,而不會背叛任何敏感性。

很奇怪。 通常,WSDL 會提供一個通用類型,當通過 wsdl.exe 或 svcutil.exe 編譯時,您將獲得一個共享的通用類型,以便在同一接口中的任意數量的方法中使用。

在同一個應用程序中引用多個獨立的 WSDL 時會出現問題,這些 WSDL 共享一個表面上相同的類型,這會導致生成兩個不同的 CLR 類型。 有很多方法可以解決這個問題——這是眾所周知的。 然后是一些相關的問題,將現有業務 object 映射到從 WSDL 生成的類型。 另一個以前探索過的景觀。

但是你說的是不同的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM