【问题标题】:HTTP module session not being set in extensionless page未在无扩展页面中设置 HTTP 模块会话
【发布时间】:2010-10-26 12:45:09
【问题描述】:

我有一个我编写的 HTTP 模块需要访问会话。我做了以下事情:

  • 模块已在 web.config 中注册
  • 模块将我的方法调用附加到 PostAcquireRequestState 事件
  • 模块实现 IRequiresSessionState

但是,当我的页面没有扩展名时(即当 htp://www.mywebsite.com 时)会话不可用并且我的代码失败。如果页面确实有 aspx 扩展名,那么一切正常。

【问题讨论】:

  • 如何访问会话?您能否添加(简化版)您的 http 模块代码?

标签: c# asp.net httpmodule


【解决方案1】:

您需要有一个由 ASP.NET 处理的项目,以便您的模块成为请求生命周期的一部分。为 index.html 之类的页面提供服务并不能做到这一点。一个 ASPX 页面。

【讨论】:

  • 我会。由 root 加载的页面是 default.aspx。如果我专门请求 default.aspx,那么会话是可用的,但是如果我只使用 mywebsite.com 那么它不是吗?
  • 网页是否可能被浏览器缓存了?
  • 不,我可以单步执行请求并在每一步评估请求。
【解决方案2】:

来自以下线程的代码可以解决问题 (1):

public class Module : IHttpModule, IRequiresSessionState
{
    public void Dispose()
    {
    }

    void OnPostMapRequestHandler(object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;

        if (app.Context.Handler is IReadOnlySessionState || app.Context.Handler is IRequiresSessionState)
            return;

        app.Context.Handler = new MyHttpHandler(app.Context.Handler);
    }

    void OnPostAcquireRequestState(object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;

        MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;

        if (resourceHttpHandler != null)
            HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
    }

    public void Init(HttpApplication httpApp)
    {
        httpApp.PostAcquireRequestState += new EventHandler(OnPostAcquireRequestState);
        httpApp.PostMapRequestHandler += new EventHandler(OnPostMapRequestHandler);
    }

    public class MyHttpHandler : IHttpHandler, IRequiresSessionState
    {
        internal readonly IHttpHandler OriginalHandler;

        public void ProcessRequest(HttpContext context)
        {
            throw new InvalidOperationException("MyHttpHandler cannot process requests.");
        }

        public MyHttpHandler(IHttpHandler originalHandler)
        {
            OriginalHandler = originalHandler;
        }

        public bool IsReusable
        {
            get { return false; }
        }
    }
}

【讨论】:

  • 您好,不幸的是,这不起作用。我已经尝试过了,但无济于事。即使在交换处理程序之后,请求无扩展页面时也没有可用的会话状态。还有其他可能导致这种情况的原因吗?我在已经安装了一些 http 模块的 Umrbaco 源代码上运行它,但是,它们都没有使用会话?
  • 您在哪个网络服务器上看到这个?
【解决方案3】:

【讨论】:

  • 链接已失效,请提供内容
猜你喜欢
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2010-12-30
相关资源
最近更新 更多