在Response.Filter中或之后的HttpModule中访问会话?

时间:2016-03-10 21:00:55

标签: asp.net session azure iis httpmodule

我正在使用 Azure 会话状态提供程序(DistributedCacheSessionStateStoreProvider)并且效果很好。但是现在我有了一个结合了脚本的自定义HttpModule。我在Response.Filter中挂钩PostAcquireRequestState。然后,我通过构造函数向我的自定义过滤器发送Session引用:

application.Response.Filter = new CombinationFilter(application.Response.Filter, application, application.Session)

修改我的过滤器中的Session,它在localhost(标准会话提供程序)上运行良好。但是当我修改Session时, Azure 上发布了值,但后来它们消失了(它们没有被保留)。只有在过滤器中添加的那些消失,之前存在的那些仍然存在。我怀疑上次同步是在ReleaseRequestState内(基于名称)。这显然是在处理Response.Filter之前。

  1. 如何在链中稍后访问Session并仍然存储它?

  2. 或者我可以在ReleaseRequestState之前以某种方式使用过滤器吗?

1 个答案:

答案 0 :(得分:0)

我终于解决了它。对于其他可能想知道如何实现这一目标的人:

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)
    }
};