我们都知道,添加一般处理程序的时候,生成的代码是这样的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace HaoSiJiaWeb.tools
{
/// <summary>
/// ceshi 的摘要说明
/// </summary>
public class ceshi : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
用ProcessRequest的参数 context来获取一些数据;
但是,如果直接获取Session是null空的;
最简单的办法是:
第一步:引用命名空间 using System.Web.SessionState;
第二步:继承IRequiresSessionState接口
第三步:获取Session
context .Session ["名字"]
完整代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
namespace HaoSiJiaWeb.tools
{
/// <summary>
/// ceshi 的摘要说明
/// </summary>
public class ceshi : IHttpHandler,IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
//获取session
string Name=context.Session["Name"].ToString();
context.Response.ContentType = "text/plain";
context.Response.Write("Hello"+Name);
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
延伸阅读
1-在 aspx和aspx.cs中,都是以Session["xxx"]="aaa"和aaa=Session["xxx"].ToString()进行读写。
而在ashx中,Session都要使用context.Session,读写方法是这样的:
context.Session["xxx"]="aaa"和aaa=context.Session["xxx"].ToString()2-在ashx文件中,要对Session进行成功的读写,
应该在使用 Session的class后增加接口IRequiresSessionState (添加时可能提示添加命名空间 using System.Web.SessionState 的引用),否则 context .Session ["xxx"]读出的总是nullaspx.cs中是直接Request和Session,而在ashx中是context.Request和 context.Session.aspx.cs中可以直接使用,是因为有Web.UI,ashx中只能靠传进去的HttpContext实例对 Request和Session等进行操作。
AppCode中的cs文件中没有Web.UI,没有HttpContext参数,如果 cs中可以得到当前的HttpContext,就可以根据这个HttpContext去操作Request和Session.
在cs中要操作Session,应该增加IRequiresSessionState 接口。HttpContext类中有一个静态属性叫Current,可以通过这个属性去得到当前的HttpContext.
在AppCode的cs文件中要得到当前访问者的IP,可以用HttpContext.Current.Request.UserHostAddress.
简单操作就是:在ashx类中添加接口 IRequiresSessionState就可。
public class TestHandler : IHttpHandler, IRequiresSessionState{}
你可能不理解的问题
问题是这样的:我同一个项目,同一个端口,同一个域名,同一台服务器,同一个环境,反正在一起就对了。
我用editor编辑器,里面有个单图上传,和一个多图上传,发现:
单图可以正常上传,
多图的话一直报错,
因为我 加了Session["xxx"]不能为空;
if (context.Session["xxx"]==null)
{
showError("未登录。");
return;
}
看截图
单图的(上传正常):并且session的count是2个
多图上传异常:session的count竟然是0个
分析发现2个的SessionID竟然不一致,经过搜索找到了答案
Kerwin1202 :
你需要明白Session的原理是什么,设置Session会有一个cookie即SessionId返回给客户端,而服务端就是通过该SessionId来获取Session的值的,所以如果你下一次请求没有带上cookie(SessionId),服务端当然获取不到信息。。
吴瑞祥:
你用的测试工具.所以有可能是你的测试工具没有保存cookie.对系统来说你第一次和第二次请求是2个回话.
在第一次请求的时候你的请求头中是没有sessionid的.在响应头中会有一个setcookie头.浏览器会根据这个响应保存cookie.然后在下次的请求中带上这个cookie.服务器在第二次请求中.根据其中的sessionid获取session信息.
其实,就是2次的回话不一致引起的,所以在日后一定要注意。
对于我最后是怎么解决的,我很暴力,不要过滤条件,因为……各种原因吧
(*^__^*) 嘻嘻