【发布时间】:2021-02-24 00:44:24
【问题描述】:
我一直在用这个拔头发。
我有一个非常简单的测试类会抛出这个错误:
失败:Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1] 执行请求时发生未处理的异常。 System.Text.Json.JsonException:检测到可能的对象循环。这可能是由于循环或对象深度大于允许的最大深度 32。考虑在 JsonSerializerOptions 上使用 ReferenceHandler.Preserve 以支持循环。
似乎没有太大的中断,因为put请求成功了,序列化也成功了。
编辑
如果序列化异常确实存在,我已经将其排除在外。我开始认为这是键入 HttpClient 的问题。它会在控制台和 Postman 的响应中抛出异常。但是,它不允许我在代码中捕获异常并且 PUT 调用有效。因此异常发生在 PUT 请求之后,并在将控制权返回给我的应用程序之前得到处理。
我将尝试使用标准的 HttpClientFactor 而不是类型化的客户端,看看是否可行。我知道 JSON 异常是一个红鲱鱼,但它很丑陋并且破坏了响应。
欢迎提出任何建议。
public virtual async Task<CouchResponse> Create(string id, string db, TObj info)
{
CouchResponse ret = new() { Reason = "Unknown and unExpected error", Ok = false };
HttpResponseMessage rc = null;
if (id is null)
{
return new CouchResponse() { Id = "missing", Ok = false, Rev = "missing" };
}
string url = $"{db}/1";
try
{
// login to Couchdb servwer
await CouchLogin();
try
{
//var jsonInfo = JsonUtils.Serialize<TestJson>(jTest);
var jsonInfo = JsonSerializer.Serialize<TObj>(info, options);
HttpContent content = new StringContent(jsonInfo, Encoding.UTF8,
"application/json");
rc = await client.PutAsync(url, content);
}
catch (Exception eNewton)
{
Console.WriteLine($"Json Exception: {eNewton.Message}");
}
if (rc is not null)
{
var str = await rc.Content.ReadAsStringAsync();
var ret = JsonSerializer.Deserialize<CouchResponse>(str,options);
rc.EnsureSuccessStatusCode();
}
return ret;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
//return ret;
}
return ret;
}
建议?
【问题讨论】:
-
我做到了。我更新了课程,然后尝试对其进行序列化,但出现错误。
-
var jsonInfo = JsonConvert.SerializeObject(jTest,jsonSerializerSettings);不会抛出异常,请参阅dotnetfiddle.net/Ko6Gww。你能分享一个minimal reproducible example吗?您的ClientBase<T>类无法编译,因为IDbAccess<>、CouchResponse和CouchLogin未定义,请参阅dotnetfiddle.net/O2MMlP。如果没有可编译和可运行的minimal reproducible example,我们不太可能提供帮助。只需共享异常的完整ToString()输出,包括异常类型、消息、回溯和内部异常(如果有的话)。 -
这是一个疯狂的错误。出于某种原因 httpClient.SendAsync 抛出 JSON 错误。但是,它不会冒泡到应用程序,而是在响应消息中返回堆栈跟踪。我将继续使用它,但可能会在 SendAsync 上提出一个问题。
标签: asp.net-core json.net .net-5