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

HttpContext is null in a method called inside Parallel.For

在尝试了很多之后发布这个问题。这样做 因为我们需要在非常短的时间内完成大量处理。

我有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;
}

正常 for 循环内一切正常。但是,当我在 Parallel.For and pass HttpContext.Current, HttpContext.Current.Request, HttpContext.Current.Request.Url as method parameters:

中调用它时

HttpContext.Current cannot be serialized because it does not have a parameterless constructor

:

To be XML serializable, types which inherit from ICollection must have an implementation of Add(System.Object) at all levels of their inheritance hierarchy. System.Web.HttpApplicationStateBase does not implement 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 cannot be serialized because it does not have a parameterless constructor

我做了这一切来发送它 reference and state 但无法理解为什么问题没有解决。

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

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

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

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

您必须通过

传递 Parallel.For 线程中的代码需要的所有数据
  • 在循环之前分配的局部变量或
  • TLocal 实例用于 Parallel.For<TLocal>.

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

该代码是专有的,因此我只发布 relevant parts:

自从通过以下 objects:

  • HttpContext.Current

  • HttpContext.Current.Request

  • HttpContext.Current.Request.Url

    作为 GetDataFor 的参数引发了很多错误。

另外,我的需求只有

  1. 请求 url 可以 re-generated 通过将 url 作为 string 传递给它的构造函数
  2. 和请求 header 的值本质上是 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;
}