【问题标题】:WCF DataContract Class is not defined in Client ApplicationWCF DataContract 类未在客户端应用程序中定义
【发布时间】:2014-09-18 17:04:43
【问题描述】:

我有一个包含 WCF 项目和数据类项目的解决方案,每个类都作为“DT”类拥有。这些 DT 类中的每一个都标记为 DataContract(),每个属性都标记为 DataMember()。

    [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 类。

【问题讨论】:

    标签: c# wcf asp.net-4.5


    【解决方案1】:

    我同意拉胡尔的观点。 你的意图对我来说没有多大意义,但如果你仍然想去那里,我认为你可以通过简单地添加:

    [ServiceKnownType(AttachmentDT)]
    

    属性位于您的 wcf 界面之上。这样您就不需要那些空方法,并且服务 WSDL 应该包含这些类型,允许任何引用您的 WCF 服务的客户端为它们生成代理。

    【讨论】:

      【解决方案2】:

      除了类可见性(在您的情况下是公共的)和缺少 DataMember 属性(这里也不是这种情况)等常见问题之外,我通常会在客户端和服务器组件之间的引用程序集中遇到重复类型的问题。

      假设您在 Visual Studio 中生成客户端代理,您是否尝试过检查“在引用的程序集中重用类型”选项?我有时会遇到问题,除非我重用 System.Runtime.Serialization.dll

      这是 MSDN 教程:http://msdn.microsoft.com/en-us/library/vstudio/bb628653(v=vs.100).aspx

      【讨论】:

      • 当我将 WCF 引用添加到我的客户端应用程序时。我取消选中重用类型框,因为我也遇到了被选中的主要问题。我基本上已经为多个应用程序创建了一个“基础”网络服务。每个应用程序只需要服务本身的某些部分,但 WCF 中的数据类需要对每个应用程序都可见。这可以防止大量代码重复。在 DataContract 上使用 Serializable 属性可以实现这一点吗?
      • 您不需要将其显式标记为可序列化。您是否尝试过通过 KnownType/ServiceKnownType 属性公开它?另外,IAttachment 接口的可见性是什么?
      【解决方案3】:

      这很明显吧?我的意思是这就是我们所说的Abstraction-encapsulation。这些数据类仅通过 WCF 服务层可见(如果必须如此)。客户不(不应该)知道这些数据类是什么以及它们做什么。

      如果您仍想显式访问这些数据类及其成员,您始终可以将这些数据类项目 DLL 的引用添加到您的客户端应用程序;但可能不推荐(OR)可能没有多大意义。

      【讨论】:

        【解决方案4】:

        我同意 Roman 将 [ServiceKnownType(...)] 添加到我的 WCF 服务的接口,正确地向客户端公开我的所有数据协定类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-06
          • 2011-09-13
          • 1970-01-01
          • 1970-01-01
          • 2013-11-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多