我在ASP.NET项目中创建两个一般处理程序:
createcode.ashx(这个用于生成验证码,生成后的验证码保存到Session中):
context.Session["code"]="123456";
vaidlcode.ashx(这个用于用户注册,在这个页面中获取生成的验证码):
string code=context.Session["code"].toString();
//这个两个一般处理程序都按照网上提示,实现接口:IRequiresSessionState,在第一个ashx程序中,调试发现Session已经创建,但是,在第二个ashx程序中,始终无法获取到Session的值,报错提示为:未将对象引用设置到对象的实例!我怀疑,是两次通过AJAX调用的ASHX不在同一个线程中,所以导致SESSION无法获取到,请问是否确实是这个问题,如果不是这个问题,应该怎么解决?我这是这两个接口是使用Soapui工具测试的。
bu不是.得要在头中看看有没sessionid
不好意思,我这边不是很清楚你说的意思,麻烦你这边能说明详细一点吗?
@有机物: session是基于cookie的.
你用的测试工具.所以有可能是你的测试工具没有保存cookie.对系统来说你第一次和第二次请求是2个回话.
在第一次请求的时候你的请求头中是没有sessionid的.在响应头中会有一个setcookie头.浏览器会根据这个响应保存cookie.然后在下次的请求中带上这个cookie.服务器在第二次请求中.根据其中的sessionid获取session信息.
@吴瑞祥: 我在问题中提到的,这两个一般处理程序是在项目中作为数据提供的接口。我创建完成后,发布到IIS上。另外创建了一个WEB项目,在这个WEB项目中通过AJAX调用第一个程序获取验证码,再调第二个程序调用用户注册,这个时候再用户注册的接口中同样也会报错,提示上面的错误信息:未将对象引用设置到对象的实例!所以,我就被搞蒙了,如果将这两个一般处理程序放到这个WEB项目中,又是好好的。
@有机物: 我上面不是已经给你解释了这种错误发生的原因了吗?
@吴瑞祥: 好的,我这边稍后抽时间测试一下。
你需要明白Session的原理是什么,设置Session会有一个cookie即SessionId返回给客户端,而服务端就是通过该SessionId来获取Session的值的,所以如果你下一次请求没有带上cookie(SessionId),服务端当然获取不到信息。。
在你的类 class 后面 继承IRequiresSessionState就可以获取到了。原理:在自定义 HTTP 处理程序中实现 IRequiresSessionState 接口,以确定处理程序是否需要对会话状态值具有读写访问权