在Parallel.For内部调用的方法中,HttpContext为null

尝试了很多后发布这个问题。 做正常不是一种选择,因为我们需要在很短的时间内完成大量的处理。

我有GetDataFor() ,其中使用了HttpContext.Current

代码如下所示:

 public void SomeMethod() { var context = HttpContext.Current; Parallel.For(0, 100, i => { var data = GetDataFor(i, context); }); } public data GetDataFor(int i, HttpContext context) { Uri requestUri = null; if (HttpContext.Current != null) { requestUri = HttpContext.Current.Request.Url; sCookie = string.Format("{0}", HttpContext.Current.Request.Headers["cookie"]); } else { requestUri = context.Request.Url; } //do something return data; } 

在正常循环中一切正常。 但是,当我在Parallel.For调用它并传递HttpContext.CurrentHttpContext.Current.RequestHttpContext.Current.Request.Url作为方法参数时 :

HttpContext.Current无法序列化,因为它没有无参数构造函数

传递HttpContextBase httpContext = null作为参数抛出 :

要进行XML可序列化,从ICollectioninheritance的类型必须在其inheritance层次结构的所有级别都具有Add(System.Object)的实现。 System.Web.HttpApplicationStateBase不实现Add(System.Object)。

试图制作一个房产:

 public string[] httpContextData { get { string requestUrl = HttpContext.Current.Request.Url.ToString(); string sCookie = string.Format("{0}", HttpContext.Current.Request.Headers["cookie"]); return new string[] { requestUrl, sCookie }; } } 

并在方法中使用:

 var contextData = httpContextData; 

抛出:

System.Uri无法序列化,因为它没有无参数构造函数

我做了所有这些以发送它的参考和状态,但无法理解为什么问题没有解决。

我如何在Parallel.For使用HttpContext.Current ? 我在这做错了什么?

顺便说一句,所需的东西是:

HttpContext.Current.Request.UrlHttpContext.Current.Request.Headers["cookie"]

HttpContext.Current仅在请求处理线程内可用(非空)。 Parallel.For创建多个线程,其中没有一个线程可以访问HttpContext.Current

您必须传递Parallel.For所有代码数据。线程需要通过

  • 在循环之前分配的局部变量
  • Parallel.For使用的TLocal实例。

无论如何,像HttpContext.Current....这样的代码已经出来了。

代码是专有的,因此我只发布相关部分 :

传递以下对象后:

  • HttpContext.Current
  • HttpContext.Current.Request
  • HttpContext.Current.Request.Url

    因为GetDataFor参数抛出了很多错误。

此外,我的需求只是

  1. 请求url ,可以通过将url作为string 传递给它的构造函数来重新生成
  2. 和请求头的值本质上是一个string

我只将string传递给GetDataFor()方法:

 public void SomeMethod() { string requestUrl = HttpContext.Current.Request.Url.ToString(); string sCookie = string.Format("{0}", HttpContext.Current.Request.Headers["cookie"]); Parallel.For(0, 100, i => { var data = GetDataFor(i, requestUrl: requestUrl, sCookie: sCookie); }); } public data GetDataFor(int i, string requestUrl = null, string sCookie = null) { Uri requestUri = null; if (HttpContext.Current != null) { requestUri = HttpContext.Current.Request.Url; sCookie = string.Format("{0}", HttpContext.Current.Request.Headers["cookie"]); } else { requestUri = new Uri(requestUrl); } //do something return data; }