2012-04-30 211 views
2

我在分佈式系統中有三個程序依賴於WCF服務進行通信。如果我有WCF服務庫中使用的數據類型,如何從引用該服務的客戶端訪問它?如何在WCF服務和客戶端之間共享對象?

我能夠從客戶端控制檯應用程序中實例化WCF服務中定義的對象,雖然沒有其他可以使用的東西了。我無法訪問任何對象的成員方法或字段。

例如,我有一個是在服務庫中使用此事務對象類和客戶端:

[DataContract] 
public class Transaction 
{ 
    public int checkoutID; 
    public DateTime time; 
    public List<object> products; 
    public double totalPrice; 
    public bool complete; 

    [OperationBehavior] 
    public void Start(int ID) 
    { 
     checkoutID = ID; 
     products = new List<object>(); 
     complete = false; 
    } 

    [OperationBehavior] 
    public void Complete() 
    { 
     time = DateTime.Now; 
     complete = true; 
    } 
} 

這是從接口文件取供服務(IService)其中另一類被定義,被稱爲CompositeType中。我錯過了什麼?我認爲WCF服務允許遠程方法和數據類型?

感謝任何能夠幫助我的人,我一直在使用WCF遇到問題。

+0

我已經爲要使用的服務添加了一個DLL,它定義了Transaction類,但是該服務無法託管,因爲它無法序列化該類。如何將它包含在序列化中? – Lee

回答

0

我無法完全理解您的問題,但從上面粘貼的代碼中,您與WCF客戶端共享方法而不是字段/屬性。您還需要在字段中應用[DataMember]屬性。

+0

我打算讓客戶端和服務能夠使用我定義爲Transaction的對象,該對象具有自己的字段和方法。 – Lee

0

將[DataMember]標籤添加到字段 - 然後序列化。

另外,[OperationContract的]應該是對的方法中,不[OperationBehavior]

7

WCF是消息傳遞系統 - 所有的客戶端和服務器共享是合同的服務(例如,服務的方法和所使用的數據類型的結構)。

客戶端和服務器之間的連線基本上是數據合同對象的XML序列化表示。但WCF默認爲不共享僅限代碼的合同(例如,不包含數據類型/類,僅包含其XML表示形式)。

因此,默認情況下,當客戶端爲給定服務創建客戶端代理時,它將能夠確定來回傳遞的數據的服務方法和XML形狀 - 並基於該信息創建具有完全相同XML表示形式的客戶端數據類 - 但它們是不同的.NET類(在客戶端名稱空間中)。

如果您控制通信的兩端 - 服務器和客戶端 - 並且兩者都在使用。NET,你可以做到這一點:

  • 把你的服務和數據合同到一個單獨的組件(YourService.Contracts或類似的東西)

  • 讓服務器端代碼引用,組裝和使用其接口和類型

  • 之前創建所述客戶端代理,參考添加到共享合同組件

  • 在這種情況下,當創建(使用Add Service Referencesvcutil命令行工具)的客戶端代理,WCF運行時將檢測到它知道已經需要的類型(因爲這些都在共享組件定義) ,它將重用這些共享類型創建新的客戶端僅數據類的代替。

+0

感謝您的回答。我之前一直在走這條路。我在客戶端和服務在本地引用的DLL中有Transaction類,但是我永遠無法讓服務工作,因爲它始終報告說,服務試圖運行時無法序列化事務類。如果我這樣做,是否需要在服務接口文件中聲明Transaction類字段和方法? – Lee

+0

@Lee:好了,第一關 - 'Transaction'是一個非常糟糕的名字 - 它使用.NET和T-SQL所有的地方。我會盡量使用更有意義的東西。所以,也許你的服務撿了錯誤的課程? .NET'Transactions'類而不是你自己的? –

+0

我明白這一點,我會改變它。然而,使用這個DLL,客戶端需要它自己的命名空間。交換和服務器一樣。他們從來沒有就實際的DLL命名空間達成一致。事務,如果你看到我在說什麼? – Lee

相關問題