【问题标题】:Array field parsed from JSON is empty从 JSON 解析的数组字段为空
【发布时间】: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?

标签: c# json wcf


【解决方案1】:

Here 解释了如何使 List 工作。我通常使用数组(例如:string[] 而不是 Array 类)来避免问题或额外的配置并在客户端进行强制转换。

【讨论】:

  • 问题不在于List,这正是我尝试过的。最初,我也使用了 string[],结果是一样的。我已修改问题以避免混淆。
猜你喜欢
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多