c# HttpContext.Current.Items在spawn线程中为空

本文关键字:线程 spawn HttpContext Current Items | 更新日期: 2023-09-27 18:18:57

我有以下api方法:

public IHttpActionResult Post(LogModel value)
{
        try
        {
            IDictionary items = HttpContext.Current.Items;
            Thread thread = new Thread(() => LogSQL.LogDetail(items, value));
            thread.Start();
            return Ok();
        }
        catch (Exception ex)
        {
            ...
        }
    }

在击中控制器之前,会调用身份验证和授权代码,它会在HttpContext.Current.Items中保存一些数据。

对于新的威胁,HttpContext.Current.Items是空的,所以我从父线程传递item数据来设置子线程中的item。

public static void LogDetail(IDictionary items, LogModel log)
    {
        var keys = (from System.Collections.DictionaryEntry dict in items
                           let key = dict.Key.ToString()
                           select key).ToList();
        foreach (var key in keys)
        {
            HttpContext.Current.Items[key] = items[key];
        }

…}

但这不起作用。HttpContext.Current.Items是空的并且是只读的,所以我不能以任何方式设置它。

我可以将'items' parm传递给新线程中需要数据的任何东西,但试图避免它。

对于如何解决这个问题有什么想法吗?我可以使用什么穿线技巧吗?

c# HttpContext.Current.Items在spawn线程中为空

HttpContext。当前绑定到处理HTTP请求的线程。如果你生成一个新线程,它将没有与它相关联的上下文。

我可以将'items' parm传递给新线程中需要数据的任何东西,但试图避免它。

这是正确的方法。从当前上下文中提取你需要的任何内容,并将其传递给你的线程。

请注意,在处理HTTP请求时产生线程有些危险,因为

  • 与请求无关的线程中未处理的异常将导致进程关闭。
  • 如果你在Web Farm中运行你的站点,你的应用程序可能会有多个实例,它们都试图在同一时间运行相同的任务。
  • 你的网站运行的AppDomain可能会因为一些原因而宕机,并带走你的后台任务。