2014-09-18 107 views
0

我有一個解決方案,其中包含一個WCF項目和一個Project for Data Classes,每個類都屬於「DT」類。每個DT類都標記爲DataContract(),每個屬性標記爲DataMember()。WCF DataContract類未在客戶端應用程序中定義

[DataContract()] 
public class AttachmentDT : IAttachment 
{ 

    private System.Int32 mAttachmentID; 
    [DataMember()] 
    public System.Int32 AttachmentID 
    { 
     get { return mAttachmentID; } 
     set { mAttachmentID = value; } 
    } 

    private System.DateTime mCreateDate; 
    [DataMember()] 
    public System.DateTime CreateDate 
    { 
     get { return mCreateDate; } 
     set { mCreateDate = value; } 
    } 

    private System.Byte[] mFileBytes; 
    [DataMember()] 
    public System.Byte[] FileBytes 
    { 
     get { return mFileBytes; } 
     set { mFileBytes = value; } 
    } 

    private System.String mFileName; 
    [DataMember()] 
    public string FileName 
    { 
     get { return mFileName; } 
     set { mFileName = value; } 
    } 
} 

我的WCF項目有一個對數據類項目的類引用,所以我有權訪問這些類。如果我沒有在WCF界面中使用它們中的任何一個,那麼使用WCF的客戶端應用程序也不能看到數據類。爲什麼是這樣?我必須認真地爲每個我希望客戶端看到的數據類創建一個空方法嗎?例如,在我的WCF接口,我創建了一個無用的方法...

[OperationContract()] 
    void AttachmentDT(AttachmentDT a) { } 

如果我有我想給可視性太20個數據類,我必須做的每一個這個愚蠢的廢話?請告訴我有一個不那麼無知的方式來獲得這些DT類的可見性。

回答

0

除了像類可見性(在你的情況下公開)和缺少DataMember屬性(這裏也不是這種情況)這樣的常見問題,我通常會在客戶端和服務器組件之間的引用程序集中遇到重複類型的問題。

假設您在Visual Studio中生成客戶端代理,是否嘗試檢查「引用程序集中的重用類型」選項?我有時會遇到問題,除非我重用System.Runtime.Serialization.dll

下面是關於它的MSDN教程:http://msdn.microsoft.com/en-us/library/vstudio/bb628653(v=vs.100).aspx

+0

當我添加到我的客戶端應用程序的WCF引用。我沒有選中重用類型框,因爲我也碰到了被檢查的主要問題。我基本上已經創建了一個「基礎」web服務,供多個應用程序使用。每個應用程序只需要某些服務本身,但WCF中的Data類需要對每個應用程序都可見。這可以防止大量代碼的重複。在DataContract上使用Serializable屬性可以達到這個目的嗎? – user1732364 2014-09-18 17:30:39

+0

你不應該明確地將它標記爲Serializable。您是否嘗試通過KnownType/ServiceKnownType屬性公開它?另外,IAttachment界面的可見性是什麼? – TGOK 2014-09-19 14:28:33

0

這是顯而易見的吧?我的意思是這就是我們所說的Abstraction-encapsulation。那些數據類只有通過WCF服務層纔可見(如果必須的話)。客戶沒有(應該不知道)這些數據類是什麼以及他們做了什麼。

如果您仍然想要顯式訪問這些Data類及其成員,則可以隨時將對這些Data Class項目DLL的引用添加到您的客戶端應用程序;但可能不被推薦(OR)可能沒有多大意義。

1

我同意拉胡爾。 你的意圖並沒有多大意義,我,但如果你還想去那裏,我想你可以通過簡單地增加實現這一點:在你的WCF接口之上

[ServiceKnownType(AttachmentDT)] 

屬性。這樣你就不需要這些空方法了,服務WSDL應該包含這些類型,允許任何引用你的WCF服務的客戶端爲它們生成代理。

0

我同意Roman向我的WCF服務接口添加[ServiceKnownType(...)],將我的所有數據合約類正確地公開給客戶端。