我使用Windor Castle通过工厂方法将 HttpContext 包装到 HttpContextWrapper 。
container.Register(
Component.For<HttpContextBase>()
.LifeStyle.PerWebRequest
.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current)));
我有一个名为SessionStorage
的班级,可以访问HttpContext.Current.Session
。我这样注册:
container.Register(
Component.For<ISessionStorage>()
.LifeStyle.PerWebRequest
.ImplementedBy<HttpSessionStorage>());
HttpSessionStorage
类:
public class HttpSessionStorage : ISessionStorage
{
public HttpContextBase httpContext { get; set; }
public void Remove(string key)
{
httpContext.Session.Remove(key);
}
public T Get<T>(string key)
{
return (T)httpContext.Session[key];
}
public void Set<T>(string key, T value)
{
httpContext.Session[key] = value;
}
}
当我以这种方式使用它时,然后在约40%的情况下, Session
属性为空且仅 < / em> 如果请求的费率非常高。
奇怪的是,如果我使用HttpContext.Current
而不是 httpContext
,那么它适用于所有情况。
public class HttpSessionStorage : ISessionStorage
{
public HttpContextBase httpContext { get; set; }
public void Remove(string key)
{
HttpContext.Current.Session.Remove(key);
}
public T Get<T>(string key)
{
return (T)HttpContext.Current.Session[key];
}
public void Set<T>(string key, T value)
{
HttpContext.Current.Session[key] = value;
}
}
这与温莎城堡有关,但我找不到问题。我将所有可能的内容注册为PerWebRequest
(NHibernate会话工厂除外)。
有人知道我还能检查什么吗?
LG
warappa
答案 0 :(得分:0)
我有一段时间遇到过类似的问题,也许我的问题的答案可以帮到你:ASP.NET MVC & Windsor.Castle: working with HttpContext-dependent services
答案 1 :(得分:0)
好吧,这不是因为没有合适的Castle Windsor注册,而是更简单:我访问会话,当时无法保证完全初始化 - 假我!
我的解决方案是将会话访问代码从Application_BeginRequest
移至Application_AcquireRequestState
pointed out here。
注意:
也许这段代码应该移到基本控制器中 - 在OnAuthorization中(编辑:它可以工作!)。