加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

使用Asp.net路由的IRouteHandler.GetHttpHandler中的会话为空

发布时间:2020-12-16 03:33:00 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试在我的IRouteHandler类的GettHttpHandler方法中启用Session,但session始终为null.有人能告诉我我做错了什么吗? 在global.asax我有 RouteTable.Routes.Add("All",new Route("{*page}",new MyRouteHandler())); Session为null的MyRouteHandler类如
我正在尝试在我的IRouteHandler类的GettHttpHandler方法中启用Session,但session始终为null.有人能告诉我我做错了什么吗?

在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,显示了这个问题.

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

编辑添加:

是的,我真的需要路由处理程序中的会话数据.有许多原因,但可以轻松解释的是当用户可以切换到以预览模式浏览网站时.

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

所以我真的需要在那个阶段的会议.

解决方法

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

>您创建自定义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接口很重要,否则IIS不会为此请求加载会话.我们不需要实现ProcessRequest和IsReusable的逻辑,但是类必须实现IHttpHandler接口.

>您更改了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);
   }
}

就是这样.适合我.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读