我有一个C#ASP.NET应用程序,它启动大约25个不同的线程,在名为SiteCrawler.cs的类中运行一些方法。 在HttpContext.Current.Session我想保存用户所做的search结果,并在所有线程完成运行时将其呈现给用户。 我的问题是HttpContext.Current对象在派生线程中为null,因为它不存在。 由于应用程序是multithreading的限制,还有什么其他选项可以在不使用会话的情况下保存用户/会话特定数据? 我试图search周围的每一个Stackoverflowfind一个解决scheme,但没有任何运气….
我的问题是有点相关: WebApi相当于HttpContext.Items与dependency injection 。 我们要使用Ninject在WebApi区域中使用HttpContext.Current注入一个类。 我担心的是,这可能是非常危险的 ,因为在WebApi( 一切? )是asynchronous的。 请纠正我,如果我在这些问题上错了,这是我到目前为止调查: HttpContext.Current通过线程获取当前上下文(我直接查看实现)。 使用HttpContext.Current里面的async Task是不可能的,因为它可以在另一个Thread上运行。 WebApi使用IHttpController和方法Task<HttpResponseMessage> ExecuteAsync =>每个请求都是async =>你不能使用HttpContext.Current里面的action方法。 它甚至可能发生,更多的请求由同一个线程执行。 创build控制器与注入东西到构造函数IHttpControllerActivator与同步方法IHttpController Create 。 这是ninject创buildController的所有依赖项的地方。 如果我在所有这4点中都是正确的,那么在动作方法或下面的任何图层中使用HttpContext.Current是非常危险的,并且会有意想不到的结果。 我看到很多接受的答案,正是这个build议。 恕我直言,这可以工作一段时间,但会在负载下失败。 但是,当使用DI来创build一个控制器和它的依赖关系时,这是正常的,因为它运行在一个单独的线程上。 我可以从构造函数中的HttpContext获得一个值,这将是安全的? 。 我想知道是否每个控制器都是在单个线程上为每个请求创build的,因为这可能会导致在负载很重的情况下可能会消耗来自IIS的所有线程的问题。 只是为了解释为什么我要注入HttpContext的东西: 一个解决scheme是获取控制器操作方法中的请求,并将所有层的所需值作为parameter passing,直到在代码中深处使用。 我们想要的解决scheme:所有的层之间都不受此影响,我们可以在代码深处使用注入的请求(例如,在一些依赖于URL的ConfigurationProvider中) 如果我总是错误的或者我的build议是正确的,请给我你的意见,因为这个主题似乎是非常复杂的。 Thx提前!
我有一个Web服务,我试图unit testing。 在服务中,它从HttpContext中提取几个值,如下所示: m_password = (string)HttpContext.Current.Session["CustomerId"]; m_userID = (string)HttpContext.Current.Session["CustomerUrl"]; 在unit testing中,我使用简单的工作请求来创build上下文,如下所示: SimpleWorkerRequest request = new SimpleWorkerRequest("", "", "", null, new StringWriter()); HttpContext context = new HttpContext(request); HttpContext.Current = context; 但是,每当我尝试设置HttpContext.Current.Session的值 HttpContext.Current.Session["CustomerId"] = "customer1"; HttpContext.Current.Session["CustomerUrl"] = "customer1Url"; 我得到空引用exception,说HttpContext.Current.Session为空。 有没有什么办法在unit testing中初始化当前会话?