我有以下问题.客户请求以下列格式返回数据的Web服务:
<status>
<name1>Some name</name1>
...
</status>
Run Code Online (Sandbox Code Playgroud)
但是当发生错误时,他们希望得到以下消息:
<status>
<error>Error description</error>
</status>
Run Code Online (Sandbox Code Playgroud)
我使用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服务中提取数据时,将忽略数据协定名称("status")和数据成员的名称,并使用类型和属性的名称.
是否可以使用客户名称?
您应该使用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 ;}
}
...
}
Run Code Online (Sandbox Code Playgroud)