我有以下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遍及任何需要新线程中的数据,但试图避免它。
关于如何解决这个问题的任何想法?我可以使用任何线程技巧吗?
答案 0 :(得分:1)
HttpContext.Current绑定到处理HTTP请求的线程。如果您生成一个新线程,它将没有与之关联的上下文。
我可以传递'项目' parm遍及任何需要新线程中的数据,但试图避免它。
这是正确的方法。从当前上下文中提取您需要的任何内容并将其传递给您的主题。
请注意,在处理HTTP请求时产生线程有点危险,因为
(Source,以及关于该主题的精彩读物,包括更好的方法)