ASP.NET笔记之 Httphandler的操作详解。
什么是Httphandler?
Httphandler(处理程序)是ASP.NET处理请求的一个模块,可以实现自定义的请求处理逻辑。Httphandler是ASP.NET MVC中请求和响应的核心组件之一,它可以拦截请求并对其进行某些操作,比如从数据库中读取数据然后呈现在页面上。
创建和注册Httphandler
创建一个Httphandler需要实现IHttpHandler接口,该接口定义了‘IsReusable’和‘ProcessRequest’方法。其中,IsReusable属性指示处理程序是否可以被重复使用。当IsReusable属性返回true时,处理程序将被重复使用;当返回false时,每次请求都会创建新的处理程序对象。ProcessRequest方法用来处理请求,处理程序将会接收到关于请求的信息和响应的内容。
public class MyHandler : IHttpHandler
{
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
// 处理请求的逻辑
...
}
}
接下来需要将处理程序注册到web.config文件中,代码示例:
<system.webServer>
<handlers>
<add name="MyHandler" verb="*" path="*.handler" type="Namespace.MyHandler, AssemblyName" />
</handlers>
</system.webServer>
这里第一个属性name表示处理程序的名称,这个值可以随意指定。verb属性表示处理程序响应的请求方式,可以是"GET"、"POST"等请求方式,也可以是"<*> ",即所有请求方式都支持。path属性指定URL中的文件扩展名/类型,以 .handler 为结尾的请求都将交给MyHandler来处理。 最后一个属性type指定一个类名和程序集名称,类名为NS名称,ProgramName是程序集名称。
示例1:自定义身份验证
我们可以通过重写Httphandler的ProcessRequest方法来实现自定义身份验证。在该示例中,我们通过数据库中的用户名和密码与用户输入的用户名和密码进行比对来验证用户身份。
public class AuthHandler : IHttpHandler
{
public bool IsReusable => true;
public void ProcessRequest(HttpContext context)
{
if (context.Request.HttpMethod == "POST")
{
var username = context.Request.Params["username"];
var password = context.Request.Params["password"];
if (CheckUser(username, password))
{
FormsAuthentication.SetAuthCookie(username, false);
context.Response.Write("Welcome " + username);
}
else
{
context.Response.Write("Login failed");
}
}
else
{
context.Response.Write("Login Page");
}
}
private bool CheckUser(string username, string password)
{
// 查询数据库中的用户信息
return true / false;
}
}
在Web.config文件中添加配置:
<system.webServer>
<handlers>
<add name="AuthHandler" verb="POST,GET" path="login.aspx" type="Namespace.AuthHandler, AssemblyName" />
</handlers>
</system.webServer>
在页面login.aspx中,加入一下代码:
<form method="POST" action="login.aspx">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" />
</form>
当用户提交登录信息时,程序将执行AuthHandler中的ProcessRequest方法,对用户身份进行验证。
示例2:路由&查询
我们可以通过重写Httphandler的ProcessRequest方法,实现自定义路由和查询。
public class CustomHandler : IHttpHandler
{
public bool IsReusable => true;
public void ProcessRequest(HttpContext context)
{
var path = context.Request.Path;
var parts = path.Split('/');
if (parts.Length == 3)
{
var op = parts[1];
var id = parts[2];
switch (op)
{
case "users":
if (int.TryParse(id, out int userId))
{
var user = Db.GetUser(userId);
context.Response.Write(JsonConvert.SerializeObject(user));
}
else
{
context.Response.Write("Invalid user ID.");
}
break;
case "products":
var product = Db.GetProduct(id);
context.Response.Write(JsonConvert.SerializeObject(product));
break;
default:
context.Response.Write("Invalid operation.");
break;
}
}
else
{
context.Response.Write("Invalid request.");
}
}
}
在Web.config文件中添加配置:
<system.webServer>
<handlers>
<add name="CustomHandler" verb="GET" path="api/*" type="Namespace.CustomHandler, AssemblyName" />
</handlers>
</system.webServer>
在页面中调用CustomHandler,示例 URL: http://www.example.com/api/users/1 或者 http://www.example.com/api/products/widgetA。
当用户请求 /api/users/1时,将返回id为1的用户信息。当用户请求 /api/products/widgetA时,将返回名称为widgetA的产品信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET笔记之 Httphandler的操作详解 - Python技术站