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传递给新线程中需要数据的任何东西,但试图避免它。
对于如何解决这个问题有什么想法吗?我可以使用什么穿线技巧吗?
HttpContext。当前绑定到处理HTTP请求的线程。如果你生成一个新线程,它将没有与它相关联的上下文。
我可以将'items' parm传递给新线程中需要数据的任何东西,但试图避免它。
这是正确的方法。从当前上下文中提取你需要的任何内容,并将其传递给你的线程。
请注意,在处理HTTP请求时产生线程有些危险,因为
- 与请求无关的线程中未处理的异常将导致进程关闭。
- 如果你在Web Farm中运行你的站点,你的应用程序可能会有多个实例,它们都试图在同一时间运行相同的任务。
- 你的网站运行的AppDomain可能会因为一些原因而宕机,并带走你的后台任务。