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

时间:2015-10-22 23:08:54

标签: c# multithreading api httpcontext

我有以下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为null,因此我从父线程传递项数据以设置子线程中的那个。

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为null且只读,因此我无法以任何方式设置它。

我可以传递'项目' parm遍及任何需要新线程中的数据,但试图避免它。

关于如何解决这个问题的任何想法?我可以使用任何线程技巧吗?

1 个答案:

答案 0 :(得分:1)

HttpContext.Current绑定到处理HTTP请求的线程。如果您生成一个新线程,它将没有与之关联的上下文。

  

我可以传递'项目' parm遍及任何需要新线程中的数据,但试图避免它。

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

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

  • 与请求无关的线程中的未处理异常将取消该过程。
  • 如果您在网络服务器场中运行您的网站,您最终可能会遇到多个同时尝试运行相同任务的应用实例。
  • 您的网站运行的AppDomain可能由于多种原因而停机,并使用它来解决您的后台任务。

Source,以及关于该主题的精彩读物,包括更好的方法)