从WCF服务返回的对象没有属性,只有'ExtentionData'

时间:2011-02-27 12:56:37

标签: wcf

我对WCF网络服务并不陌生,但自从上次使用WCF网络服务以来已有几年了。我确信上次使用WCF服务时,您可以在开发代码时确定从服务调用返回的对象类型。 EG;

MyService.Models.ServiceSideObjects.User user = myServiceClient.GetUser();

然后您可以自由使用'user'对象客户端。但是现在好像WCF服务不会返回除包含基本值类型(string,int等)的对象之外的任何内容。到目前为止,我已经通过定义仅包含这些基本值类型的传输对象并使服务将复杂的“用户”对象属性映射到传输对象中的简单字符串和int来解决了这个问题。

例如,当您拥有包含更复杂对象的自定义类型对象(例如我的Ticket对象)时,这将变得非常痛苦。

public class Ticket
{
    public Agent TicketAgent {get;set;}
    public Client Owner {get;set;}
    public PendingReason TicketPendingReason {get;set;}
}

简单地将此对象图映射到具有大量相互关联的系统类型属性的单个传输类,会给出一个非常“脏”的客户端业务模型。我错误地认为我应该能够从服务方法调用中接收我的Ticket对象并在服务器端以相同的状态处理客户端吗?

我意识到这可能违反了某些SoA委托人或者类似的东西,但我目前正在使用此服务的桌面应用程序是消耗它的唯一消费者。所以我不在乎许多其他客户端是否能够管理从服务返回的数据类型,因此需要一些非常规范化的返回对象。我只是希望我的服务从其存储库中获取Ticket类型的对象,将此对象返回到客户端,其所有属性都保持不变。目前,我得到的只是一个具有单个属性“ExtentionData”的对象,该对象在客户端无法使用。

希望这是有道理的,谢谢你的时间。

2 个答案:

答案 0 :(得分:4)

我可能错过了一个备忘录,但我认为您需要使用DataContractAttribute来装饰您的模型类,并使用DataMemberAttribute来修饰您的属性,如下所示:

[DataContract( Namespace = "http://example.com" )]
public class Ticket
{
    [DataMember]
    public Agent TicketAgent { get; set; }

    [DataMember]
    public Client Owner { get; set; }

    [DataMember]
    public PendingReason TicketPendingReason { get; set; }
}

这就是您可能想要设置DTO图层的原因,以避免污染您的模型类。

对于ExtensionData,它用于向前兼容:http://msdn.microsoft.com/en-us/library/ms731083.aspx

答案 1 :(得分:2)

我已经将Niklas的回答标记为答案,因为它解决了我的问题。

虽然您似乎不需要使用[DataContract][DataMember],但在某些情况下,我认为这可能会导致我遇到的问题。当简单地传输自定义类型对象时,这些对象本身只具有简单类型的属性,不需要任何属性。但是,当我尝试传输自定义类型对象的自定义类型对象时,需要属性。

感谢您的时间。

相关问题