Session HttpContextBase:会话为空

Session HttpContextBase:会话为空,session,castle-windsor,httpcontext,Session,Castle Windsor,Httpcontext,我使用Windor Castle通过工厂方法将HttpContext包装成HttpContextWrapper container.Register( 用于()的组件 .livelope.PerWebRequest .UsingFactoryMethod(()=>新的HttpContextWrapper(HttpContext.Current)); 我有一个名为SessionStorage的类,它访问HttpContext.Current.Session。我是这样登记的: container.

我使用Windor Castle通过工厂方法将HttpContext包装成HttpContextWrapper

container.Register(
用于()的组件
.livelope.PerWebRequest
.UsingFactoryMethod(()=>新的HttpContextWrapper(HttpContext.Current));
我有一个名为
SessionStorage
的类,它访问
HttpContext.Current.Session
。我是这样登记的:

container.Register(
用于()的组件
.livelope.PerWebRequest
.ImplementedBy());
HttpSessionStorage
类:

公共类HttpSessionStorage:ISessionStorage
{
公共HttpContextBase httpContext{get;set;}
公共无效删除(字符串键)
{
httpContext.Session.Remove(键);
}
公共T获取(字符串键)
{
返回(T)httpContext.Session[key];
}
公共无效集(字符串键,T值)
{
httpContext.Session[key]=值;
}
}
当我以这种方式使用它时,在大约40%的情况下,
会话
属性为空
,并且仅当请求的速率非常高时

奇怪的是,如果我使用
HttpContext.Current
而不是
HttpContext
,它在所有情况下都有效

公共类HttpSessionStorage:ISessionStorage
{
公共HttpContextBase httpContext{get;set;}
公共无效删除(字符串键)
{
HttpContext.Current.Session.Remove(键);
}
公共T获取(字符串键)
{
返回(T)HttpContext.Current.Session[key];
}
公共无效集(字符串键,T值)
{
HttpContext.Current.Session[key]=值;
}
}
这和温莎城堡有关,但我找不到问题所在。我尽可能地将所有内容注册为
PerWebRequest
(NHibernate会话工厂除外)

有人知道我还能查什么吗

Lg

瓦拉帕

我不久前也遇到过类似的问题,也许我的问题的答案可以帮助你:

好吧,这不是因为温莎城堡注册不当,而是更简单的问题:我不保证完全初始化的时候访问了会话-欺骗我

我的解决方案是将访问代码的会话从
Application\u BeginRequest
移动到
Application\u acquisiteRequestState
类似的位置

注:
也许这段代码应该被移动到一个基本的控制器中-在一个授权中(edit:它起作用!)。

你能定义“非常高的请求率”吗?你能发布一个失败的测试吗?您是否尝试过将其转换为瞬态而不是PerWebRequest?“极高的请求率”:ImageController必须提供约25幅图像。每次向任何控制器发出请求(本控制器也是如此),都会创建一个主体并将其存储在会话中(通过HttpSessionStorage)。如前所述,有时保存失败是因为包装器中会话中的会话为空。