使用Asp.net路由的IRouteHandler.GetHttpHandler中的会话为空
我正在尝试在我的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); } } 就是这样.适合我. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net页面如何知道哪个按钮触发了回发?
- ASP.NET核心Facebook身份验证中间件用户图片
- asp.net – 对我来说MVC?
- asp.net – 如何将我的Autofac容器插入ASP NET身份2.1
- ASP.net:如何测试LINQ查询
- asp.net – 实体框架:如何解决“FOREIGN KEY约束可能导致循
- asp.net – 在服务器端管理不断增长的CSS样式表 – 是否有任
- 如何在ASP.NET ListBox中设置多个选择?
- asp.net – 在ashx文件中,我可以设置返回文件的文件名吗?
- asp.net-mvc – MVC4应用程序“无法加载DLL’libmp3lame.32
- asp.net-mvc-3 – EF 4.1 – 模型关系
- asp.net-mvc – 如何阻止用户在MVC3应用程序上登
- .net – 404控制器在外部组件
- asp.net-mvc-3 – 同一页面中的两个ValidationSu
- asp.net – FormsAuthentication.SetAuthCookie做
- asp.net-mvc – 如何在MVC6或AspNet Core或Ident
- asp.net-mvc-3 – WebGrid列中的MVC3 Html.Begin
- asp.net – 从Repeater中检索TextBox值
- ASP.NET MVC:从FileResult返回大量数据
- asp.net – 获取隐藏字段的值