【问题标题】:Serializing an IHttpActionResult as JSON causes exception将 IHttpActionResult 序列化为 JSON 会导致异常
【发布时间】:2015-06-26 21:28:02
【问题描述】:

我有一个小的 Web API 2 应用程序,我试图在其中实现传入请求和传出响应的日志记录(主要是记录您通过 Fiddler2 看到的 HTTP 流量)。

在尝试序列化方法的响应时,我遇到了我不确定如何处理的异常。我试过玩 JsonSerializerSettings 等等。我可能会以完全错误的方式来做这件事。非常感谢任何指导。

这是导致异常的代码片段。

var response = Ok(successMessage);
JsonSerializerSettings settings = new JsonSerializerSettings
{
    PreserveReferencesHandling=Newtonsoft.Json.PreserveReferencesHandling.Objects,
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
this.Logging.LogMessage(MessageType.ServiceResponse, JsonConvert.SerializeObject(response, Formatting.Indented, settings));
return response;

例外:

    Newtonsoft.Json.JsonSerializationException: Error getting value from 'ReadTimeout' on 'System.Web.HttpInputStream'. ---> 
System.InvalidOperationException: Timeouts are not supported on this stream.   at System.IO.Stream.get_ReadTimeout()   at GetReadTimeout(Object ) 
at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)   --- End of inner exception stack trace --- 
at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)

【问题讨论】:

    标签: c# json asp.net-web-api


    【解决方案1】:

    响应中是否存在一对多的关系?响应是否包含一个列表,并且在该列表项中它包含对响应的引用?

    当构建一个 json 子节点不能引用它们的父节点时,你会在尝试序列化时出现无限循环。

    构建视图模型并删除对父级的引用。只需传递父母身份。

    【讨论】:

    • 等一下。你为什么不直接返回 ok (successmessage)
    • 因为我想将响应记录在数据库中。这是一个简单的示例,但我们还希望记录其他响应条件,其中存在请求验证错误以及类似的情况。
    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2016-05-23
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多