有HttpHander经验的进来

Agemo 2004-08-14 04:18:53
为什么ProcessRequest(HttpContext context)中context.Session始终是null呢?怎么才能取到Session对象呢?
而且path为*.do的时候,request并不会发送给这个httpHandler对象
所以改成了*do.aspx,可是session始终为null
有谁告诉我,如何在HttpHandler中访问session吗?谢谢

web.config中的配置
<system.web>
...
<httpHandlers>
<add verb="*" path="*do.aspx" type="Agemo.Handler.Controller, Agemo"/>
</httpHandlers>
...
</system.web>

实现IHttpHandler接口的类
/**
* @file Controller.cs
*
* @author Agemo
* @date 2004-08-11
*/

using System;
using System.Collections;
using System.Reflection;
using System.Web;
using System.Web.SessionState;
using Agemo.Application;
using Agemo.Entity;

namespace Agemo.Handler
{
/// <summary>
/// Controller 的摘要说明。
/// </summary>
public class Controller : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
// check login
try
{
string opname = context.Request["opname"];
HttpSessionState session = context.Session;

if(session == null || session["userid"] == null)
{
if(opname != null && opname.Equals("login"))
{
string username = context.Request["username"];

if(username == null || username.Length == 0)
{
// print login page
context.Response.Write(LoginPage);
return;
}
}
else
{
// print requirelogin page
context.Response.Write(RequireLoginPage);
return;
}
}
else if(opname != null && opname.Equals("logout"))
{
context.Session.Clear();
context.Response.Redirect(loginPage);
return;
}
// check login end

Hashtable htCtrl = new Operation().GetCtrlInfo(opname);
if(htCtrl == null)
{
context.Response.Write(IllegalPage);
return;
}

if(session != null)
{
object authbit = session["authbit"];
if( authbit != null &&
(((long)authbit) & ((long)htCtrl["authbit"])) == 0)
{
context.Response.Write(NoPrivilegePage);
return;
}
}

IApplication theApp =
(IApplication)Activator.CreateInstance(
Type.GetType((string)htCtrl["classname"]));
theApp.Init((string)htCtrl["outpage"], (string)htCtrl["errpage"]);

theApp.SetSession(session);
theApp.DoProcess(context.Request.Params);
context.Response.Write(theApp.GenerateOutpage());
}
catch(Exception e)
{
context.Response.Write(e.StackTrace);
context.Response.Write(e.Message);
//context.Response.Write(e.StackTrace);
}
}

public bool IsReusable
{
get
{
return false;
}
}

private string IllegalPage
{
get
{
return null;
}
}

private string RequireLoginPage
{
get
{
return null;
}
}

private string NoPrivilegePage
{
get
{
return null;
}
}

private string LoginPage
{
get
{
IApplication app = (IApplication)new LoginDealer();
app.Init(loginPage, null);
app.DoProcess(null);
return app.GenerateOutpage();
}
}

private static readonly string loginPage = "login.html";
}
}
...全文
146 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
darren_zhu_NZ 2004-08-14
  • 打赏
  • 举报
回复
我觉得Session应该是在这里被创建的,而不是被取得的. 就像用户访问一个aspx页面的时候, 第一步IIS分派工作给worker process, 然后runtime里勾结HttpContext(Request,Response之类的),然后调用HttpRuntime.ProcessRequest这个方法;至于具体是哪个来Handler来ProcessRequest,worker process会进一步分配给HttpApplication,这个例子会发现是默认的aspx Handler来处理.

所以,我觉得Session本来就应该是null,就等你来创建一个了
goody9807 2004-08-14
  • 打赏
  • 举报
回复
给你一个默认的Web.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="DSN" value="server=localhost;uid=sa;pwd=;database=yidiwang" />
</appSettings>
<system.web>
<httpHandlers>
<add verb="*" path="PageTest.csps"
type="CsdnTest.PageTest,CsdnTest" />
</httpHandlers>
<!-- 动态调试编译
设置 compilation debug="true" 以启用 ASPX 调试。否则,将此值设置为
false 将提高此应用程序的运行时性能。
设置 compilation debug="true" 以将调试符号(.pdb 信息)
插入到编译页中。因为这将创建执行起来
较慢的大文件,所以应该只在调试时将该值设置为 true,而在所有其他时候都设置为
false。有关更多信息,请参考有关
调试 ASP.NET 文件的文档。
-->
<compilation
defaultLanguage="c#"
debug="true"
/>

<!-- 自定义错误信息
设置 customError 模式值可以控制应向
用户显示用户友好错误信息而不是错误详细信息(包括堆栈跟踪信息):

“On”始终显示自定义(友好的)信息
“Off”始终显示详细的 ASP.NET 错误信息。
“RemoteOnly”只对不在本地 Web 服务器上运行的
用户显示自定义(友好的)信息。出于安全目的,建议使用此设置,以便
不向远程客户端显示应用程序的详细信息。
-->
<customErrors
mode="RemoteOnly"
/>

<!-- 身份验证
此节设置应用程序的身份验证策略。可能的模式是“Windows”、“Forms”、
“Passport”和“None”
-->
<authentication mode="None">
</authentication>

<!-- 应用程序级别跟踪记录
应用程序级别跟踪在应用程序内为每一页启用跟踪日志输出。
设置 trace enabled="true" 以启用应用程序跟踪记录。如果 pageOutput="true",则
跟踪信息将显示在每一页的底部。否则,可以通过从 Web 应用程序
根浏览 "trace.axd" 页来查看
应用程序跟踪日志。
-->
<trace
enabled="false"
requestLimit="10"
pageOutput="false"
traceMode="SortByTime"
localOnly="true"
/>

<!-- 会话状态设置
默认情况下,ASP.NET 使用 cookie 标识哪些请求属于特定的会话。
如果 cookie 不可用,则可以通过将会话标识符添加到 URL 来跟踪会话。
若要禁用 cookie,请设置 sessionState cookieless="true"。
-->
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;user id=sa;password="
cookieless="false"
timeout="20"
/>

<!-- 全球化
此节设置应用程序的全球化设置。
-->
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>

</system.web>

</configuration>
webdiyer 2004-08-14
  • 打赏
  • 举报
回复
实现IRequiresSessionState接口
Agemo 2004-08-14
  • 打赏
  • 举报
回复
为什么ProcessRequest(HttpContext context)中context.Session始终是null呢?怎么才能取到Session对象呢?
而且path为*.do的时候,request并不会发送给这个httpHandler对象
所以改成了*do.aspx,可是session始终为null
有谁告诉我,如何在HttpHandler中访问session吗?谢谢

web.config中的配置
<system.web>
...
<httpHandlers>
<add verb="*" path="*do.aspx" type="Agemo.Handler.Controller, Agemo"/>
</httpHandlers>
...
</system.web>

实现IHttpHandler接口的类
/**
* @file Controller.cs
*
* @author Agemo
* @date 2004-08-11
*/


using System;
using System.Data.SqlClient;
using System.Collections;
using System.Reflection;
using System.Web;
using System.Web.SessionState;
using Agemo.Application;
using Agemo.Entity;

namespace Agemo.Handler
{
/// <summary>
/// Controller 的摘要说明。
/// </summary>
public class Controller : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
// check login
try
{
string opname = context.Request["opname"];
HttpSessionState session = context.Session;

if(session == null || session["userid"] == null)
{
if(opname != null && opname.Equals("login"))
{
string username = context.Request["username"];

if(username == null || username.Length == 0)
{
// print login page
context.Response.Write(LoginPage);
return;
}
}
else
{
// print requirelogin page
context.Response.Write(RequireLoginPage);
return;
}
}
else if(opname != null && opname.Equals("logout"))
{
context.Session.Clear();
context.Response.Redirect(loginPage);
return;
}
// check login end

Hashtable htCtrl = new Operation().GetCtrlInfo(opname);
if(htCtrl == null)
{
context.Response.Write(IllegalPage);
return;
}

if(session != null)
{
object authbit = session["authbit"];
if( authbit != null &&
(((long)authbit) & ((long)htCtrl["authbit"])) == 0)
{
context.Response.Write(NoPrivilegePage);
return;
}
}

IApplication theApp =
(IApplication)Activator.CreateInstance(
Type.GetType((string)htCtrl["classname"]));
theApp.Init(
(string)htCtrl["outpage"],
(string)htCtrl["errpage"]);

theApp.SetSession(session);
theApp.DoProcess(context.Request.Params);
context.Response.Write(theApp.GenerateOutpage());
}
catch(Exception e)
{
context.Response.Write(e.StackTrace);
context.Response.Write(e.Message);
//context.Response.Write(e.StackTrace);
}
}

public bool IsReusable
{
get
{
return true;
}
}

private string IllegalPage
{
get
{
return null;
}
}

private string RequireLoginPage
{
get
{
return null;
}
}

private string NoPrivilegePage
{
get
{
return null;
}
}

private string LoginPage
{
get
{
IApplication app = (IApplication)new LoginDealer();
app.Init(loginPage, null);
app.DoProcess(null);
return app.GenerateOutpage();
}
}

private static readonly string loginPage = "login.html";
}
}

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧