談WCF資料契約疑問之共享資料契約

2021-08-25 03:18:44 字數 2238 閱讀 8252

最近在做專案的時候,發現同乙個資料契約再客戶端隸屬於兩個不同的命名空間,為此如果兩個服務進行互動的時候會涉及到型別 的問題,互操作性很差,要進行不必要的拆和裝,在前面終於讓我找到了答案,下面我來描述一下這個場景,大家請看下面

[實體類]  大家請注意命名空間

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

namespace

garychenwcfservice

public

string

***}}

下面是1號服務  注意:返回的是garychenwcfservice.customer型別的物件

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

namespace

garychenwcfservice.serviceclasses

#endregion

下面是2號服務  注意:新增的是garychenwcfservice.customer型別的物件

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

namespace

garychenwcfservice.serviceclasses

#endregion}}

宿主部分我們省略...我們來看客戶端,問題來了

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

namespace

garychenclient}}

1號服務取得的customer屬於onecustomerservice命名空間,現在我要把這個取得出來的物件放入2號服務去進行處理,

這就出現了同乙個資料契約兩個不同的命名空間問題,大家看一下物件瀏覽器兩個**所生成的東西,

這樣一來我們如果要放進2號服務去操作的話必須顯示宣告twocustomerservice_proxy.customer進行轉換,這樣的場景

或許大家都經常碰到,下面我說一下解決辦法,

按照wcf程式設計第二版中的說法,我把原話給大家發一下

在visual studio 2008新增乙個服務引用時,你必須為每個服務引用提供唯一的新命名空間。匯入的型別會定義在這個新的命名空間中。如果為共享了相同資料契約的兩個不同服務新增引用,就會出現問題,因為你得到了兩個不同的型別,在兩個不同的命名空間,表示的卻是相同的資料契約。然而,預設情況下,如果被客戶端引用的任意乙個程式集包含的資料契約,與已經暴露在引用服務元資料的資料契約型別匹配,visual studio 2008就不會再次匯入。需要再次強調的是,已有的資料契約引用必須是在另乙個引用程式集中,而不是在客戶端專案自身。這一限制會在未來的visual studio版本中提供,而目前最方便的彌補措施與最佳實踐則為:將所有共享的資料契約分解到指定的類庫中,並讓所有的客戶端引用該程式集。然後,通過服務引用的高階設定對話方塊(參見圖1-10),可以控制和配置引用程式集(如果存在)與有關的共享資料契約進行協調。「reuse types in referenced assemblies」檢查框預設是被選中的,但如果你需要也可以關閉這一功能。顧名思義,你只能共享資料契約,卻不能共享服務契約。使用裡面的單選按鈕,可以讓visual studio 2008跨所有的引用程式集重用資料契約,或者通過選擇列表項限制對特定程式集的共享。

s這段話的意思就是讓你把我服務端的dll引用到客戶端來,在服務配置中來共享同乙個資料契約,見下圖

大家看見沒有,需要指定服務引用的程式集,這樣才不會存在命名空間型別的問題,這樣做我知道非常不合理,但是如果客戶端自

己開發的話而不是其他平台呼叫的話這樣也是沒有辦法中的辦法,期待wcf下乙個版本可以改進這一點!!

我的部落格:www.

garychen.net

WCF揭秘 共享資料契約

當客戶端引用wcf服務時,必須為服務定義乙個唯一的命名空間。在預設情況下,這個服務中所用到的類會被匯入到這個命名空間內。這樣,在不同的服務內引用同乙個資料契約時就會遇到乙個問題 在客戶端,同乙個資料契約被匯入到不同的命名空間中,無法實現轉換。在以下例子中,personservice與contract...

wcf資料契約

專案中需要使用繼承關係,乙個函式返回特定的子類,在序列化的時候需要告訴序列化器,在父類檔案中使用kowntype注釋即可。namespace healthadminwebservice.logic datamember public string exercisestep datamember pu...

WCF簡單教程 4 資料契約

第四篇 用資料契約傳遞自定義資料物件 之前的演示中,我們一直都是在用string型別做引數和返回值,實際專案中肯定會傳遞自定義的資料型別。與webservice不同,wcf想傳遞自定義資料,必須要將其定義為資料契約。看乙個例子 using system using system.runtime.se...