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.Url
和 HttpContext.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
的参数引发了很多错误。
另外,我的需求只有
- 请求 url 可以 re-generated 通过将 url 作为
string
传递给它的构造函数
- 和请求 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;
}
在尝试了很多之后发布这个问题。这样做
我有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.Url
和 HttpContext.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
的参数引发了很多错误。
另外,我的需求只有
- 请求 url 可以 re-generated 通过将 url 作为
string
传递给它的构造函数 - 和请求 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;
}