gpt4 book ai didi

c# - HttpRequestMessage.Content 在 ASP.Net Web API 中的日志记录 DelegatingHandler 中读取时丢失

转载 作者:可可西里 更新时间:2023-11-01 08:04:47 26 4
gpt4 key购买 nike

当尝试在 Controller 中的 Action 中访问对象时,它有时似乎为 null。我发现这是由于 DelegatingHandlerSendAsync() 覆盖中的 ReadAsStringAsync() 造成的。问题在于内容。当我的客户端发送内容主体并在记录器中读取它时,它永远不会被 Controller 操作调用程序读取(或者可能位于 JsonFormatter 中的某处)。我怀疑随后对 Content.ReadAsStringAsync() 的调用不会引发异常,但也不会返回预期的内容主体(返回一些信息表明异步读取已完成)。

但我的问题仍然存在,因为我想在操作中读取一个 [FromBody] 参数,当 Content.ReadStringAsync 的 RaceCondition 由 委托(delegate)处理程序。当 JsonFormatter 赢得它时,我得到了对象,但这种情况很少见(仅在服务启动时)。

这是我的 DelegatingHandler 代码:

public class LogHandler : DelegatingHandler
{

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var apiRequest = new WebApiUsageRequest(request);
WriteLog(apiRequest);
request.Content.ReadAsStringAsync().ContinueWith(t =>
{
apiRequest.Content = t.Result;
WriteLog(apiRequest);
});

return base.SendAsync(request, cancellationToken).ContinueWith(task =>
{
var apiResponse = new WebApiUsageResponse(task.Result);
apiResponse.Content = task.Result.Content != null ? task.Result.Content.ReadAsStringAsync().Result : null;
WriteLog(apiResponse);
return task.Result;
});
}
}

有没有人知道这个问题的解决方案?

最佳答案

这是设计的。在 ASP.NET Web API 中,正文内容被视为只能读取一次的只进流。

您可以尝试使用 ASP.NET Web API Tracing 但我还没有用 POST 请求测试它所以我不确定它如何/是否跟踪请求主体(它正在跟踪GET 请求的参数是肯定的)。您可以在这里阅读更多内容:

关于c# - HttpRequestMessage.Content 在 ASP.Net Web API 中的日志记录 DelegatingHandler 中读取时丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com