我在类库中有一个带有自定义Cache对象的WebSite。所有项目都运行.NET 3.5。 我想将此类转换为使用会话状态而不是缓存,以便在我的应用程序回收时保留状态服务器中的状态。 但是,当我从Global.asax文件访问方法时,此代码抛出“HttpContext.Current.Session为null”的异常。我这样叫这个班:
Customer customer = CustomerCache.Instance.GetCustomer(authTicket.UserData);
为什么对象始终为null?
public class CustomerCache: System.Web.SessionState.IRequiresSessionState
{
private static CustomerCache m_instance;
private static Cache m_cache = HttpContext.Current.Cache;
private CustomerCache()
{
}
public static CustomerCache Instance
{
get
{
if ( m_instance == null )
m_instance = new CustomerCache();
return m_instance;
}
}
public void AddCustomer( string key, Customer customer )
{
HttpContext.Current.Session[key] = customer;
m_cache.Insert( key, customer, null, Cache.NoAbsoluteExpiration, new TimeSpan( 0, 20, 0 ), CacheItemPriority.NotRemovable, null );
}
public Customer GetCustomer( string key )
{
object test = HttpContext.Current.Session[ key ];
return m_cache[ key ] as Customer;
}
}
正如你所看到的,我已经尝试将IRequiresSessionState添加到类中,但这没有什么区别。
干杯 延
答案 0 :(得分:16)
并不是真的要将State包含在你的类中,而是将你在Global.asax中调用它。会话不适用于所有方法。
一个工作的例子是:
using System.Web.SessionState;
// ...
protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
{
HttpContext context = HttpContext.Current;
// Your Methods
}
}
它不起作用,例如在Application_Start
中答案 1 :(得分:0)
根据您尝试做的事情,您可能还可以在Global.asax中使用Session_Start和Session_End:
http://msdn.microsoft.com/en-us/library/ms178473(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
}
请注意在依赖Session_End之前对SessionState模式的限制。