2014-09-18 105 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(...)],将我的所有数据合约类正确地公开给客户端。