1

我有以下问题。一位客户请求了一个 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 服务中提取数据时,数据协定名称(“状态”)和数据成员的名称被忽略,而使用类型和属性的名称。

是否可以使用客户名称?

4

2 回答 2

8

您应该使用 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 ;}
    }
...
}
于 2009-07-13T11:20:39.710 回答
0

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

于 2009-07-13T20:13:16.377 回答