检测到可能不支持的对象循环(异步和等待)

问题描述 投票:0回答:1

我有一个用 .Net 4.8 编写的应用程序,它作为最小的 API 运行。 一切都很完美,我搬进了 .Net 6。

更新后,以下代码开始抛出错误并向响应添加其他内容:

app.MapPost("/zxc/asd", ([FromBody] ModelDto modelDto,
        IEndpointHelper endpointHelper, HttpContext httpContext, CancellationToken cancellationToken)
    => httpContext.FromResponseMessage(endpointHelper.Process(modelDto, cancellationToken)));

添加的内容:“不支持‘System.Type’实例的序列化和反序列化”。

我能够通过将代码更改为异步来解决此问题,但这也需要一些解决方法。

app.MapPost("/zxc/asd", async ([FromBody] ModelDto modelDto,
        IEndpointHelper endpointHelper, HttpContext httpContext, CancellationToken cancellationToken)
    => await DoAsync(httpContext, modelDto, cancellationToken, endpointHelper));

async Task DoAsync(HttpContext httpContext, ModelDto modelDto, CancellationToken cancellationToken, IEndpointHelper endpointHelper) => 
    await httpContext.FromResponseMessageAsync(endpointHelper.Process(modelDto, cancellationToken));

奇怪的是,我无法直接从 app.MapPost 运行 httpContext.FromResponseMessageAsync,因为我正在检索以下错误:“检测到不支持的可能的对象循环。这可能是由于循环或对象深度更大……”

知道为什么会这样吗?或者也许如何删除这个附加方法?

.net async-await httpcontext
1个回答
0
投票

为了进行测试,您可以从 System.Text.Json(.Net 中的默认)切换到 Newtonsoft.Json

(此处为异步调用)。

app.MapPost("/zxc/asd", new Delegate((Func<ModelDto, IEndpointHelper, HttpContext, CancellationToken, Task<IActionResult>>) (async (modelDto, endpointHelper, httpContext, cancellationToken) => { var result = await endpointHelper.Process(modelDto, cancellationToken); var jsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(result); return await httpContext.FromResponseMessageAsync(jsonResult); })));
如果对象循环错误仍然存在,另一种方法是手动处理序列化和反序列化以避免循环。例如,再次进行测试:

app.MapPost("/zxc/asd", new Delegate((Func<ModelDto, IEndpointHelper, HttpContext, CancellationToken, Task<IActionResult>>) (async (modelDto, endpointHelper, httpContext, cancellationToken) => { var result = await endpointHelper.Process(modelDto, cancellationToken); var settings = new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }; var jsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(result, settings); return await httpContext.FromResponseMessageAsync(jsonResult); })));
    
© www.soinside.com 2019 - 2024. All rights reserved.