ASP.NET微信开发自定义会话管理攻略
1. 简介
微信公众号开发需要用到微信的会话管理,微信提供了默认的会话功能,但是很多时候,开发者的业务需求与微信默认的会话功能并不完全匹配,这时候就需要自定义会话管理。本攻略就是讲解如何通过ASP.NET开发自定义会话管理。
2. 实现步骤
2.1 SessionState模式
微信的会话管理需要依赖ASP.NET的SessionState特性,所以第一步就是要在Web.config文件中配置SessionState模式,一般有三种模式:
- InProc:将会话数据保存在Web服务器的内存中,这种模式默认是开启的,但是当IIS进程回收或者IIS重启时,会话数据就会丢失。
- StateServer:将会话数据存储于ASP.NET State Service服务中,这种模式可以实现不同的Web服务器之间共享会话数据,但是会话数据需要进行序列化操作,所以不支持对于一些数据类型的存储。
- SQLServer:将会话数据存储于SQL Server数据库中,这种模式可以实现不同的Web服务器之间共享会话数据,且可以直接存储数据类型。
这里以SQL Server模式为例,在Web.config文件中添加以下代码:
<sessionState mode="SQLServer"
cookieless="false"
timeout="20"
sqlConnectionString="Server=.;database=mydb;uid=sa;pwd=123;">
<providers>
<clear />
<add name="SqlSessionStateProvider" type="System.Web.SessionState.SqlSessionStateStore" />
</providers>
</sessionState>
2.2 自定义会话管理
ASP.NET要在Web.Session_Start事件中定义自己的SessionID管理器,这需要继承IHttpModule接口,并在Web.config文件中注册:
<httpModules>
<add name="MySessionIDManager"
type="WebApplication4.MySessionIDManager, WebApplication4"/>
</httpModules>
自定义的SessionID管理器需要在OnAcquireRequestState事件中检查请求的用户是否已经登录,如果没有登录,则生成一个新的SessionID,并且将用户信息加入会话中。在OnReleaseRequestState事件中更新会话存储信息。
以下是一个简单的示例:
public class MySessionIDManager : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
}
void context_ReleaseRequestState(object sender, EventArgs e)
{
// 操作会话
}
void context_AcquireRequestState(object sender, EventArgs e)
{
// 操作会话
}
}
3. 示例说明
示例1:自定义会话数据类型
有时候需要存储一些自定义的数据类型到会话中,这个时候需要自定义ISessionStateItemCollection接口,在Web.Session_Start事件中将自定义数据类型添加到会话中,以下是一个简单的示例:
public class MySessionStateItemCollection : ISessionStateItemCollection
{
private Dictionary<string, object> _dict = new Dictionary<string, object>();
public void Add(string name, object value)
{
_dict.Add(name, value);
}
public void Remove(string name)
{
_dict.Remove(name);
}
public void RemoveAt(int index)
{
//do nothing
}
public void Clear()
{
_dict.Clear();
}
public int Count
{
get { return _dict.Count; }
}
public object this[string name]
{
get { return _dict[name]; }
set { _dict[name] = value; }
}
public object this[int index]
{
get { return _dict.ElementAt(index).Value; }
set { _dict.ElementAt(index).Value = value; }
}
public IEnumerator GetEnumerator()
{
return _dict.GetEnumerator();
}
}
public class MySessionIDManager : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
}
void context_ReleaseRequestState(object sender, EventArgs e)
{
// 操作会话
}
void context_AcquireRequestState(object sender, EventArgs e)
{
HttpSessionState session = HttpContext.Current.Session;
// 自定义数据类型
MyObject obj = new MyObject();
obj.Name = "test";
obj.Age = 18;
// 添加会话数据
MySessionStateItemCollection collection = new MySessionStateItemCollection();
collection.Add("myobject", obj);
session["mydata"] = collection;
// 操作会话
}
}
public class MyObject
{
public string Name { get; set; }
public int Age { get; set; }
}
示例2:从会话中删除数据
在ASP.NET会话管理中,通常情况下删除会话数据需要使用Session.Remove()方法,但是该方法不支持同时删除多个键值对。所以可以自定义SessionManager类,增加自定义的RemoveRange()方法。
以下是一个简单的示例:
public class SessionManager
{
public static void RemoveRange(string[] keys)
{
foreach (string key in keys)
{
HttpContext.Current.Session.Remove(key);
}
}
}
public class MySessionIDManager : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
}
void context_ReleaseRequestState(object sender, EventArgs e)
{
// 操作会话
}
void context_AcquireRequestState(object sender, EventArgs e)
{
HttpSessionState session = HttpContext.Current.Session;
// 删除会话数据
SessionManager.RemoveRange(new string[] { "key1", "key2"});
// 操作会话
}
}
4. 结论
通过自定义会话管理,ASP.NET可以自由地操作会话数据,满足更多的业务需求。但是要注意,由于会话数据存储在Web服务器中,所以不能存储敏感数据,这需要开发者自己处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net微信开发(自定义会话管理) - Python技术站