【问题标题】:How to use HttpContext inside Task.Run如何在 Task.Run 中使用 HttpContext
【发布时间】:2020-06-09 01:27:29
【问题描述】:

有一些帖子解释了如何解决,但对我没有多大帮助.. 在中间件中记录请求/响应,当使用 'await' 和 Task.Run() 时它可以工作,但由于它等待当前操作完成存在性能问题。

当我如下删除等待时,它运行速度很快但不记录任何内容,因为 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() 性能?

【问题讨论】:

  • 为什么需要通过Task.Run 运行AdvanceLoggingAsync

标签: async-await task-parallel-library


【解决方案1】:

好吧,您可以从上下文中提取您需要的内容,构建您想要记录的字符串,然后将该字符串传递给您运行的任务。

但是,解雇并忘记一项任务并不好。如果它抛出异常,您可能会关闭服务器,或者至少您将很难获得有关错误的信息。

如果您担心日志记录性能,最好将您需要记录的内容添加到消息队列中,并有一个进程来响应队列中的新消息并将消息记录到日志文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多