簡體   English   中英

如何通過 WCF 服務發送 IList?

[英]How can I send an IList via WCF Service?

我想在我的 WCF 服務中使用 NHibernate,如何通過 WCF 服務發送 IList?

- -編輯 - - - -

我可以將 IList 放入object變量中並發送嗎?

嘗試傳遞IList<T>並不適合基於 WCF 的服務。

WCF 在數據合同方面進行了討論,定義了服務或客戶端期望發送和接收的數據的形狀。 這些合約必須足夠具體,序列化程序才能知道如何將它們轉換為 XML、JSON 和其他表示形式。

當您將IList<T>之類的接口放入服務合同時,您沒有為序列化程序提供有關數據指定形狀的足夠信息。 您只關心發送實現的IList<T>部分嗎? 你對實現接口的東西所包含的任何其他有狀態數據感興趣嗎? 序列化程序無法知道。

最簡單的解決方案是使用帶有 WCF 的基本數據傳輸對象。 這些是簡單的類,它們只負責表示要通過介質傳輸的信息。 這些類只包含具體類型,序列化程序很容易理解。 當您想發送消息時,您創建這些對象的實例並用數據填充它們。

對於您的示例,創建List<T>而不是IList<T>並將值復制到列表中,然后再將其傳遞到服務中。 一個簡單的方法是使用Enumberable.ToList<T>()擴展方法。

序列化程序需要知道具體類型,所以用 [ServiceKnownType] 注釋合同,這樣它就知道 IList 可以使用哪些類型

更新: object 無濟於事,因為序列化程序仍然不知道該怎么做 - 您需要使用 [ServiceKnownType] 告訴它 - 如果您不想這樣做,您可以在此處提供一個返回類型列表的方法編譯時顯式

您需要使用 generics 並標記它是什么類型的列表,以便服務知道會發生什么。 方法可能如下所示:

public IList<Something> GetSomething()

也就是說,當我這樣做時,我傾向於返回一個數組,只是因為在稍后閱讀代碼時很少猜測它將返回什么(另一端的非 WCF 客戶端是否為它創建了 IList class把它轉換成別的東西?)。 一切都知道數組是什么。

進一步使用 List 類型的概念
-- 為什么不直接使用數組?

數組似乎是最明顯的選擇,因為它與 IEnumerable 兼容,並且客戶端可以使用自己的擴展方法

暫無
暫無

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

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