我有一个用 .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,因为我正在检索以下错误:“检测到不支持的可能的对象循环。这可能是由于循环或对象深度更大……”
知道为什么会这样吗?或者也许如何删除这个附加方法?
为了进行测试,您可以从 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);
})));