Ray*_*ydk 53 c# asp.net session httpcontext
我有一个C#ASP.NET应用程序,它启动了大约25个不同的线程,在一个名为SiteCrawler.cs的类中运行一些方法.
在HttpContext.Current.Session我要保存用户所做的搜索结果,当所有线程都完成运行它呈现给用户.我的问题是该HttpContext.Current对象在生成的线程中为null,因为它不存在.
由于应用程序是多线程的限制,我还有什么其他选项来保存用户/会话特定数据而不使用会话?
我试图搜索Stackoverflow的每一寸都找到一个解决方案,但没有任何运气....
Dmi*_*sky 75
在我的应用程序中有很多代码使用HttpContext.Current,我无法修改该代码.
worker.DoWork()从下面的示例中使用该代码.而且我必须在单独的线程中运行它.
我来到以下解决方案:
HttpContext ctx = HttpContext.Current;
Thread t = new Thread(new ThreadStart(() =>
{
HttpContext.Current = ctx;
worker.DoWork();
}));
t.Start();
// [... do other job ...]
t.Join();
Run Code Online (Sandbox Code Playgroud)
Den*_*aub 11
看看Fritz Onion的这篇文章:在服务器端Web代码中使用线程和构建异步处理程序.这很长,但你的要求不是太微不足道.
K. Scott Allen也发表了一篇关于这个问题的文章:使用HttpContext.Current
@Rory在上面做了一个评论,HttpContext即使你将它传递给Thread ,它中的某些对象也会变为null.这件事发生在我身上User.因此,您可以将用户复制到线程CurrentPrincipal,如下所示:
_user = HttpContext.Current.User;
var processThread = new Thread(() => ThreadedCode());
processThread.Start();
Run Code Online (Sandbox Code Playgroud)
private static void ThreadedCode()
{
// Workaround for HttpContext.Current.User being null.
// Needed for CreatedBy and RevisedBy.
Thread.CurrentPrincipal = _user;
Run Code Online (Sandbox Code Playgroud)
请注意,HttpContext仅在请求的生命周期内可用.该线程可能比请求更长时间存在,这可能是您首先需要一个线程的原因!:)
只需将 HttpContext.Current 添加到类 SiteCrawler.cs 的构造函数中
public class SiteCrawler
{
HttpContext context = HttpContext.Current;
public void Method()
{
context.WhateverYouWant
}
}
Run Code Online (Sandbox Code Playgroud)