当前位置: 首页 > news >正文

实战 HTTP 处理程序(HTTP Handler) (4)--与Web程序共享Session

让 HTTP 处理程序与当前的Web程序共享Session,实在是简单到了不能再简单的地步——只要让类 MyHandler 实现 System.Web.SessionState.IRequiresSessionState 接口就行了。就像这样
MyHandler.cs
public class MyHandler : System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
    
// 
}

之后我们在 MyHandler 类里面就可以通过 context.Session 或 直接使用 System.Web.HttpContext.Current.Session 来访问 Web 应用程序的 Session 了。

下面我们来作一个很简单的 Demo。它实现的效果和本系列第二篇的效果完全一样。只不过这次使用的方法不是通过字符串参数而是使用 Session 将信息由Web程序传递给 MyHandler。这是完成后的效果


源代码

MyHandler.cs
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 using System.IO;
 6 using System.Drawing;
 7 using System.Drawing.Imaging;
 8 
 9 namespace mylib.system.web
10 {
11     public class MyHandler : System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState
12     {
13         #region IHttpHandler 成员
14 
15         public bool IsReusable
16         {
17             get { return false; }
18         }
19 
20         public static string msg
21         {
22             get { return System.Web.HttpContext.Current.Session["mylib.system.web.MyHandler.msg"as string; }
23             set { System.Web.HttpContext.Current.Session["mylib.system.web.MyHandler.msg"= value; }
24         }
25 
26         public void ProcessRequest(System.Web.HttpContext context)
27         { 
28             string s = (msg == null)? "null" : msg;
29 
30             context.Response.ContentType = "text/html";
31             context.Response.Write("<html><body>" + s + "</body></html>");
32         }
33         #endregion
34     }
35 }
36 

Default.aspx
 1 <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
 2 
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4 
 5 <html xmlns="http://www.w3.org/1999/xhtml" >
 6 <head runat="server">
 7     <title>无标题页</title>
 8 </head>
 9 <body>
10     <form id="form1" runat="server">
11     <div>
12        <iframe src="~/MyHandler.jxd"></iframe>
13     </div>
14     </form>
15 </body>
16 </html>
17 

Default.aspx.cs
 1 using System;
 2 using System.Data;
 3 using System.Configuration;
 4 using System.Web;
 5 using System.Web.Security;
 6 using System.Web.UI;
 7 using System.Web.UI.WebControls;
 8 using System.Web.UI.WebControls.WebParts;
 9 using System.Web.UI.HtmlControls;
10 
11 using System.Collections.Generic;
12 
13 public partial class _Default : System.Web.UI.Page 
14 {
15     protected void Page_Load(object sender, EventArgs e)
16     {
17         mylib.system.web.MyHandler.msg = "impossible is nothing";
18     }
19 }


上面的代码用了几个小技巧:

1.  避免 Session 重名。我们的应用程序可能会有许多地方会用到 Session,如果出现重名,就会产生很难捉到的 Bug,所以我们必须使用一种可以有效避免重名的命名规范。在本例中,我们使用的命名规范是“命名空间名+类名+属性名”,见 MyHandler.cs 的第22行。

2. 将对 Session 的访问封装到属性中。为了避免 Session 重名,我们使用了很长的 Session 名称。这长长的名字即不易读,也难以书写。放到代码中,会使代码冗长而丑陋。更要命的是,如果万一需要修改某个 Session 名字,就需要在整个项目中进行查找和替换,这是一项既乏味又危险的工作。解决方法是,将对 Session 的读写封装到一个静态的属性中,见 MyHandler.cs 的第20~24行、MyHandler.cs 的第28行、Default.aspx.cs 的第17行。

3. 使用 System.Web.HttpContext.Current.Session 访问当前Web 应用程序的Session。通常我们是使用 Page.Session(在网页的后台代码中)或 context.Session(在 MyHandler 类的 ProcessRequest 函数中)来访问当前Web应用程序的 Session。但是在类库中,我们无法获取 Page 变量或 context 变量,这时我们就可以使用System.Web.HttpContext.Current.Session 访问当前Web 应用程序的Session,见 MyHandler.cs 的第20~24行。

本篇到此结束,下一篇将利用本篇的代码,稍加改动,实现不需临时文件,直接生成PDF文件并下载到客户端。

下载本篇全部源代码

本系列共6篇文章
    实战 HTTP 处理程序(HTTP Handler) (6)——条码随意打
    实战 HTTP 处理程序(HTTP Handler) (5)——不用临时文件,直接打开动态生成的文件
    实战 HTTP 处理程序(HTTP Handler) (4)——与Web程序共享Session   <- you are here.
    实战 HTTP 处理程序(HTTP Handler) (3)——动态生成图片
    实战 HTTP 处理程序(HTTP Handler) (2)——向HTTP 处理程序传递参数   
    实战 HTTP 处理程序(HTTP Handler) (1)——创建一个最简单的 HTTP Handler  

 

转载于:https://www.cnblogs.com/1-2-3/archive/2007/09/05/879664.html

相关文章:

  • DOM事件流
  • 绝对路径 相对路径 相对虚拟目录路径
  • Oracle Long类型转换为Clob类型
  • 三维模型逐渐透明化
  • [转]奇文-闲话操作系统(1/4)
  • 如何得到需要下载文件的链接(路径)?
  • 同网段存活IP公钥分发脚本
  • javascript小技巧
  • vue
  • go关键字之struct定义声明方式
  • linux环境变量配置
  • Embed Youtube or Not
  • 用postman模拟ajax发送json数据的笔记
  • 心情随感
  • NABCD分析
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Akka系列(七):Actor持久化之Akka persistence
  • Brief introduction of how to 'Call, Apply and Bind'
  • C++11: atomic 头文件
  • extract-text-webpack-plugin用法
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • jquery cookie
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • nodejs:开发并发布一个nodejs包
  • Python_网络编程
  • storm drpc实例
  • Vue 动态创建 component
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 检测对象或数组
  • 面试总结JavaScript篇
  • 使用Gradle第一次构建Java程序
  • 突破自己的技术思维
  • 栈实现走出迷宫(C++)
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • hi-nginx-1.3.4编译安装
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # 透过事物看本质的能力怎么培养?
  • #{}和${}的区别?
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $ git push -u origin master 推送到远程库出错
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (Forward) Music Player: From UI Proposal to Code
  • (二)丶RabbitMQ的六大核心
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • ***测试-HTTP方法
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [<死锁专题>]
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [bzoj1038][ZJOI2008]瞭望塔