在 Response.Filter 或之后在 HttpModule 中访问会话?
Access session in HttpModule in or after Response.Filter?
我正在使用 Azure 会话状态提供程序 (DistributedCacheSessionStateStoreProvider
),它运行良好。但是现在我有一个结合脚本的自定义HttpModule
。我在 PostAcquireRequestState
中挂钩 Response.Filter
。然后我通过构造函数发送 Session
对我的自定义过滤器的引用:
application.Response.Filter = new CombinationFilter(application.Response.Filter, application, application.Session)
修改我的过滤器中的 Session
,它在本地主机(标准会话提供程序)上完美运行。但是在 Azure 上发布时,当我修改 Session
时,值在那里,但后来它们消失了(它们没有持久化)。只有添加到过滤器中的那些才会消失,之前存在的那些仍然存在。我怀疑最后一次同步是在 ReleaseRequestState
内(基于名称)。这显然是在我的 Response.Filter
被处理之前。
我怎样才能在链的后面访问 Session
并仍然存储它?
或者我可以在 ReleaseRequestState
之前以某种方式使用过滤器吗?
终于解决了。对于可能想知道如何实现这一点的其他人:
application.PostRequestHandlerExecute += (sender, args) =>
{
if (YourCondition)
{
// performs premature flush to force the filter
application.Response.Flush();
String content = ((CombinationFilter) application.Response.Filter).OriginalContent;
// we need to remove the filter to not execute twice
application.Response.Filter = null;
// do my stuff here, we still have a Session and also the original content
// the content is stored on a filter in Flush() method before modification
// (by me => my custom property)
// do not write any other content
application.Response.SuppressContent = true;
// onwards it still saves Session in ReleaseRequestState (presumably)
}
};
我正在使用 Azure 会话状态提供程序 (DistributedCacheSessionStateStoreProvider
),它运行良好。但是现在我有一个结合脚本的自定义HttpModule
。我在 PostAcquireRequestState
中挂钩 Response.Filter
。然后我通过构造函数发送 Session
对我的自定义过滤器的引用:
application.Response.Filter = new CombinationFilter(application.Response.Filter, application, application.Session)
修改我的过滤器中的 Session
,它在本地主机(标准会话提供程序)上完美运行。但是在 Azure 上发布时,当我修改 Session
时,值在那里,但后来它们消失了(它们没有持久化)。只有添加到过滤器中的那些才会消失,之前存在的那些仍然存在。我怀疑最后一次同步是在 ReleaseRequestState
内(基于名称)。这显然是在我的 Response.Filter
被处理之前。
我怎样才能在链的后面访问
Session
并仍然存储它?或者我可以在
ReleaseRequestState
之前以某种方式使用过滤器吗?
终于解决了。对于可能想知道如何实现这一点的其他人:
application.PostRequestHandlerExecute += (sender, args) =>
{
if (YourCondition)
{
// performs premature flush to force the filter
application.Response.Flush();
String content = ((CombinationFilter) application.Response.Filter).OriginalContent;
// we need to remove the filter to not execute twice
application.Response.Filter = null;
// do my stuff here, we still have a Session and also the original content
// the content is stored on a filter in Flush() method before modification
// (by me => my custom property)
// do not write any other content
application.Response.SuppressContent = true;
// onwards it still saves Session in ReleaseRequestState (presumably)
}
};