当前位置 : 主页 > 网络编程 > net编程 >

ASP.NET MVC 项目中 一般处理程序ashx 获取Session为null空

来源:互联网 收集:自由互联 发布时间:2023-09-07
我们都知道,添加一般处理程序的时候,生成的代码是这样的 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace HaoSiJiaWeb.tools { /// summary /// ceshi 的摘要说明 /// /

我们都知道,添加一般处理程序的时候,生成的代码是这样的

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"]读出的总是null

aspx.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个

ASP.NET MVC 项目中 一般处理程序ashx 获取Session为null空_上传

多图上传异常:session的count竟然是0个

ASP.NET MVC 项目中 一般处理程序ashx 获取Session为null空_上传_02

分析发现2个的SessionID竟然不一致,经过搜索找到了答案


Kerwin1202 :
你需要明白Session的原理是什么,设置Session会有一个cookie即SessionId返回给客户端,而服务端就是通过该SessionId来获取Session的值的,所以如果你下一次请求没有带上cookie(SessionId),服务端当然获取不到信息。。


吴瑞祥:
你用的测试工具.所以有可能是你的测试工具没有保存cookie.对系统来说你第一次和第二次请求是2个回话.
在第一次请求的时候你的请求头中是没有sessionid的.在响应头中会有一个setcookie头.浏览器会根据这个响应保存cookie.然后在下次的请求中带上这个cookie.服务器在第二次请求中.根据其中的sessionid获取session信息.


其实,就是2次的回话不一致引起的,所以在日后一定要注意。

对于我最后是怎么解决的,我很暴力,不要过滤条件,因为……各种原因吧

(*^__^*) 嘻嘻

 

 

 

 

 



【文章转自迪拜服务器 http://www.558idc.com/dibai.html处的文章,转载请说明出处】
网友评论