在 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 被处理之前。

  1. 我怎样才能在链的后面访问 Session 并仍然存储它?

  2. 或者我可以在 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)
    }
};