【问题标题】:Custom datacontract / datamember name自定义数据合同/数据成员名称
【发布时间】:2009-07-13 11:05:10
【问题描述】:

我有以下问题。一位客户请求了一个 Web 服务,该服务以下列格式返回数据:

<status>
 <name1>Some name</name1>
 ...
</status>

但是当发生错误时,他们希望得到以下消息:

<status>
 <error>Error description</error>
</status>

我使用 WCF 创建了一个 Web 服务,为了满足要求,我定义了以下服务合同:

[ServiceContract] public interface IPatronStatus { [OperationContract] [ServiceKnownType("GetKnownTypes", typeof(KnownTypesProvider))] [WebGet(UriTemplate = "/service/status?user={unilogin}")] StatusData GetPatronStatus(string unilogin); }

并且还定义了如下基类:

[DataContract(Name="status")] public class StatusData { }

还有两个派生类:

public class PatronStatusData : StatusData { private string _name; [DataMember(Name = "name1", Order = 0)] public string Name { get { return _name; } set { _name = value; } } ... }

还有:

public class UniLoginNotFoundError : StatusData { public UniLoginNotFoundError() { } private string _description = "UniLoginNotFoundError"; [DataMember(Name = "error", Order = 0)] public string Description { get { return _description; } } }

问题在于,当我从 Web 服务中提取数据时,会忽略数据协定名称(“状态”)和数据成员的名称,而使用类型和属性的名称。

是否可以使用客户名称?

【问题讨论】:

  • 请编辑问题以准确显示 XML 现在的样子。

标签: wcf datacontract datamember


【解决方案1】:

您应该使用 DataContract(Name="Something") 装饰 UniLoginNotFoundError 和 PatronStatusData 以使其工作。但是您不能为它们设置相同的名称(“状态”)。 在您的特定情况下,我最好使用未使用的属性设置为 null 的单个类。

[DataContract(Name="status")]
public class StatusData
{
    private string _name;
    private string _errorDescription = null;


    [DataMember(Name = "name1", Order = 0, EmitDefaultValue=false)]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }


    [DataMember(Name = "error", Order = 1, EmitDefaultValue=false)]
    public string Description
    {
        get{ return _errorDescription ;}
        set {_errorDescription =value ;}
    }
...
}

【讨论】:

  • +1 是的,这就是要走的路。如果您想更加清楚,您还可以在 DataMember 属性中添加一个“IsRequired=false”,以明确这两个字符串都不是必需的。
【解决方案2】:

一般来说,想要对通过序列化数据协定生成的 XML 进行过多控制是错误的。这就是 XML 序列化器的陷阱。用通用术语定义合约,让客户端消费结果,这通常很简单。

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 2011-08-31
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2015-12-26
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多