【发布时间】:2015-05-25 13:13:13
【问题描述】:
我不明白为什么会这样。我正在通过 WCF 使用 REST 服务。如果出现错误,服务会发送这种消息体(我在 Fiddler 中看到):
{"Errors":["Some text"],"StatusCode":500}
我为此创建了一个类,并通过 Message.GetBody() 获取它。 StatusCode 已填充,但 Errors 始终为空(不是 null,而是为空)。我尝试过 String[],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="")],因为我收到错误“期望元素 ErrorResult 带有命名空间 'bla-bla-bla' 但得到元素 'root' 带有命名空间 ''”。
更新。我注意到另一个实体存在同样的问题,即服务结果类型。它包含 2 个整数字段,返回时它们为 0,即使我可以在 Fiddler 和 Message.ToString() 值中看到。我已通过将 Name="..." 添加到 DataMember 属性来解决此问题,即使这些名称与属性名称相同,但大小写除外(JSON camel vs C# pascal)。我确信 C# 解析不区分大小写!好的,但是在主题中为 ErrorResult 添加名称仍然没有解决数组的问题。
更新 2。好的,在没有找到任何解决方案之后,我以“丑陋的方式”做了一个解决方法。至少这立即开始工作。
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 中的错误”并放弃了它。
【问题讨论】:
-
有几个属性如
FaultExceptionsEnabled,HelpEnabled&IncludeExceptionDetailInFaults你可以在config中启用。你试过了吗? -
阿米特,我已经检查了这些,但它们看起来并不适用。 FaultExceptionsEnabled 必须是服务器配置,我在客户端。只是为了检查,我已经为客户的行为设置了它,结果也不例外!使用 [FaultContract] 并捕获 T 的 FaultException 给了我希望,但不幸的是,这并没有奏效。如果我之前没有从消息中获得详细信息,我会收到 CommunicationException。我无法控制服务器,只能控制客户端。
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
为什么要使用 WCF 来使用 REST 服务?只需使用
HttpClient或类似的东西。既然您正在接收 JSON,为什么不使用 JSON 序列化器/反序列化器,例如 JSON.NET?