我不明白为什么会这样。我通过WCF使用REST服务。如果出现错误,服务会发送这种消息体(我在Fiddler中看到):
{"Errors":["Some text"],"StatusCode":500}
我为此创建了一个类,并通过Message.GetBody()获取它。 StatusCode已填充,但错误始终为空(不为空,但为空)。我试过String [],List of String,也尝试过初始化后备字段。这有什么不对?
这是班级:
[DataContract(Name="root", Namespace="")]
public class ErrorResult
{
[DataMember]
public string[] Errors { get; set; }
[DataMember]
public int StatusCode { get; set; }
public override String ToString()
{
return String.Join(Environment.NewLine, Errors);
}
}
以下是解析:
public void AfterReceiveReply(ref Message reply, object correlationState)
{
var resp = reply.Properties[HttpResponseMessageProperty.Name] as HttpResponseMessageProperty;
if (resp != null && resp.StatusCode != HttpStatusCode.OK)
{
String message = null;
try
{
ErrorResult res = reply.GetBody<ErrorResult>();
if (res != null)
{
message = res.ToString();
}
}
catch { }
if (!String.IsNullOrEmpty(message))
{
throw new Exception(message);
}
}
}
我正在使用[DataContract(Name="root", Namespace="")]
,因为我收到了错误&#34;期待元素ErrorResult与命名空间&#39; bla-bla-bla&#39;但得到了元素&#39; root&#39;使用命名空间&#39;&#39;&#34;。
更新即可。我注意到另一个实体的相同问题,即服务结果类型。它包含2个整数字段,并且返回时它们是0,即使我可以在Fiddler和Message.ToString()值中看到它。我通过添加Name =&#34; ...&#34;来解决这个问题。到DataMember属性,即使这些名称与属性名称相同,除了大写(JSON camel vs C#pascal)。我确信C#解析不区分大小写!好的,但是在主题中为ErrorResult添加名称仍然没有解决数组的问题。
更新2 。好的,在没有找到任何解决方案后,我以一种丑陋的方式做了一个解决方法&#34;。至少这一刻就开始了。
XmlDocument doc = new XmlDocument();
doc.LoadXml(reply.ToString());
String message = String.Join(Environment.NewLine,
doc.SelectNodes("/root/Errors/item").OfType<XmlNode>().Select(n => n.InnerText));
我也尝试过使用Message.GetReaderAtBodyContents()的XMlSerialzer,但在XML&#34;中得到错误#34;放弃了。