gpt4 book ai didi

asp.net - 使用 Asp.net 路由的 IRouteHandler.GetHttpHandler 中的 session 为 null

转载 作者:行者123 更新时间:2023-12-02 06:28:42 25 4
gpt4 key购买 nike

我试图在 IRouteHandler 类的 GettHttpHandler 方法中启用 session ,但 session 始终为空。有人可以告诉我我做错了什么吗?

在 global.asax 中我有

RouteTable.Routes.Add("All", new Route("{*page}", new MyRouteHandler()));

Session 为 null 的 MyRouteHandler 类如下所示:

public class MyRouteHandler : IRouteHandler, IRequiresSessionState
{
public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext)
{
string test = HttpContext.Current.Session["test"].ToString();
return BuildManager.CreateInstanceFromVirtualPath("~/Page.aspx", typeof(Page)) as Page;
}
}

我做了一个小test app这说明了问题。

有人可以告诉我我做错了什么吗?

编辑添加:

是的,我确实需要路由处理程序中的 session 数据。原因有很多,但一个容易解释的原因是用户可以切换到以预览模式浏览网站。

该网站由数据库中的动态页面(/page1/page2...)层次结构组成,可以正常发布或预览。浏览网站的内容制作者可以选择仅查看普通页面或发布预览的页面。浏览模式存储在用户的 session 中,因此路由处理程序需要知道浏览模式才能解决所请求的页面。

所以我真的需要在那个阶段进行 session 。

最佳答案

我已经在 this answer 中解释了这个问题背后的原因。现在我已经找到了解决问题的方法!

  1. 您创建一个自定义 HttpHandler 类:

    class MyHttpHandler : IHttpHandler, IRequiresSessionState
    {
    public MyRequestHandler RequestHandler;
    public RequestContext Context;
    public MyHttpHandler(MyRequestHandler routeHandler, RequestContext context)
    {
    RequestHandler = routeHandler;
    Context = context;
    }

    public void ProcessRequest(HttpContext context)
    {
    throw new NotImplementedException();
    }

    public bool IsReusable
    {
    get { throw new NotImplementedException(); }
    }
    }

添加IRequiresSessionState接口(interface)非常重要,否则IIS不会为此请求加载 session 。我们不需要实现 ProcessRequest 的逻辑和IsReusable ,但类必须实现 IHttpHandler 接口(interface)。

  • 您更改 RouteHandler 实现:

    public class MyRequestHandler : IRouteHandler
    {
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
    return new MyHttpHandler(this, requestContext);
    }

    public IHttpHandler DelayedGetHttpHandler(RequestContext requestContext)
    {
    // your custom routing logic comes here...
    }
    }
  • 您只需将原始的 session 相关逻辑移至 DelayedGetHttpHandler函数和 GetHttphandler函数返回一个有帮助的 MyHttpHandler 类的实例。

  • 然后,将处理逻辑挂接到 HttpApplication.PostAcquireRequestState事件,例如在 Global.asax 中:

    public class Global : HttpApplication
    {
    public override void Init()
    {
    base.Init();
    PostAcquireRequestState += Global_PostAcquireRequestState;
    }
    }
  • 如需更多引用,请查看此页面:https://msdn.microsoft.com/en-us/library/bb470252(v=vs.140).aspx 。它解释了请求生命周期以及我使用 PostAcquireRequestState 的原因事件。

  • 在事件处理程序中,您调用自定义 RouteHandling 函数:

    void Global_PostAcquireRequestState(object sender, EventArgs e)
    {
    if (HttpContext.Current.Handler is MyHttpHandler) {
    var handler = HttpContext.Current.Handler as MyHttpHandler;
    HttpContext.Current.Handler = handler.RouteHandler.DelayedGetHttpHandler(handler.Context);
    }
    }
  • 就是这样。对我有用。

    关于asp.net - 使用 Asp.net 路由的 IRouteHandler.GetHttpHandler 中的 session 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3067908/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com