如何在内部使用 HttpContext Task.Run
How to use HttpContext inside Task.Run
有些帖子解释了如何解决,但对我帮助不大..
在中间件中记录 Request/Response,它在使用 'await' 和 Task.Run() 时有效,但由于它等待当前操作完成,因此存在性能问题。
当我如下所示删除 await 时,它运行速度很快但不记录任何内容,因为 HttpContext 实例不可用于在并行线程中使用
public class LoggingHandlerMiddleware
{
private readonly RequestDelegate next;
private readonly ILoggerManager _loggerManager;
public LoggingHandlerMiddleware(RequestDelegate next, ILoggerManager loggerManager)
{
this.next = next;
_loggerManager = loggerManager;
}
public async Task Invoke(HttpContext context, ILoggerManager loggerManager, IWebHostEnvironment environment)
{
_ = Task.Run(() =>
{
AdvanceLoggingAsync(context, _loggerManager, environment);
});
...
}
private void AdvanceLoggingAsync(HttpContext context, ILoggerManager loggerManager, IWebHostEnvironment environment, bool IsResponse = false)
{
{
context.Request.EnableBuffering(); // Throws ExecutionContext.cs not found
result += $"ContentType:{context.Request.ContentType},";
using (StreamReader reader = new StreamReader(context.Request.Body, Encoding.UTF8, true, 1024, true))
{
result += $"Body:{await reader.ReadToEndAsync()}";
context.Request.Body.Position = 0;
}
loggerManager.LogInfo($"Advance Logging Content(Request)-> {result}");
}
如何在访问 HttpContext 时利用 Task.Run() 性能?
好吧,您可以从上下文中提取您需要的内容,构建您要记录的字符串,然后将该字符串传递给您 运行 的任务。
但是,触发和忘记任务并不好。如果它抛出异常,您可能会导致服务器宕机,或者至少您将很难获得有关错误的信息。
如果您关心日志记录性能,最好将您需要记录的内容添加到消息队列中,并有一个进程响应队列中的新消息并将消息记录到日志文件中。
有些帖子解释了如何解决,但对我帮助不大.. 在中间件中记录 Request/Response,它在使用 'await' 和 Task.Run() 时有效,但由于它等待当前操作完成,因此存在性能问题。
当我如下所示删除 await 时,它运行速度很快但不记录任何内容,因为 HttpContext 实例不可用于在并行线程中使用
public class LoggingHandlerMiddleware
{
private readonly RequestDelegate next;
private readonly ILoggerManager _loggerManager;
public LoggingHandlerMiddleware(RequestDelegate next, ILoggerManager loggerManager)
{
this.next = next;
_loggerManager = loggerManager;
}
public async Task Invoke(HttpContext context, ILoggerManager loggerManager, IWebHostEnvironment environment)
{
_ = Task.Run(() =>
{
AdvanceLoggingAsync(context, _loggerManager, environment);
});
...
}
private void AdvanceLoggingAsync(HttpContext context, ILoggerManager loggerManager, IWebHostEnvironment environment, bool IsResponse = false)
{
{
context.Request.EnableBuffering(); // Throws ExecutionContext.cs not found
result += $"ContentType:{context.Request.ContentType},";
using (StreamReader reader = new StreamReader(context.Request.Body, Encoding.UTF8, true, 1024, true))
{
result += $"Body:{await reader.ReadToEndAsync()}";
context.Request.Body.Position = 0;
}
loggerManager.LogInfo($"Advance Logging Content(Request)-> {result}");
}
如何在访问 HttpContext 时利用 Task.Run() 性能?
好吧,您可以从上下文中提取您需要的内容,构建您要记录的字符串,然后将该字符串传递给您 运行 的任务。
但是,触发和忘记任务并不好。如果它抛出异常,您可能会导致服务器宕机,或者至少您将很难获得有关错误的信息。
如果您关心日志记录性能,最好将您需要记录的内容添加到消息队列中,并有一个进程响应队列中的新消息并将消息记录到日志文件中。