【发布时间】:2015-10-22 23:08:53
【问题描述】:
我有以下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 为空,所以我从父线程传递项目数据以设置子线程中的数据。
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 并且是只读的,所以我不能以任何方式设置它。
我可以将“items”参数传递给新线程中任何需要数据的地方,但尽量避免它。
关于如何解决这个问题的任何想法?我可以使用任何线程技巧吗?
【问题讨论】:
-
了解为什么您无法在衍生线程上获取上下文的最简单方法是查看当新衍生线程实际上直到请求结束才开始执行代码时会发生什么 - 您期望“当前" 设置在那个时候?
标签: c# multithreading api httpcontext