HttpApplication是如何处理请求的
HttpApplication根据请求报文的url扩展名,来创建一个具体的处理程序。为了他让HttpApplication不与具体的处理程序耦合,可以考虑让所有处理程序都实现一个接口,如下:
interface IHttpHandler{
void ProcessRequest(HttpContext context);
}
HttpApplication:IHttpHandler{
public void ProcessRequest(HttpContext context){
IHttpHandler handler;//现在HttpApplicationIHttpHandler不再与具体的处理程序耦合了。
handler.ProcessRequest(context);
}
}
现在,让HttpApplication与一个IHttpHandler进行通信,因此我们将HttpApplication与具体的处理程序隔离开来了。可是现在的问题是,如何初始化IHttpHandler呢?
我们可以考虑使用一个工厂,这个工厂将根据请求报文的URL扩展名来决定使用什么处理程序,如下:
class HttpApplication{
public void ProcessRequest(HttpContext context){
HandlerFactory handlerFactory=new HandlerFactory(context.Request.Url.Extension);
IHttpHandler handler=handlerFactory.GetHandler(context.Request.URL.AbsolutePath);
}
}
class HandlerFactory{
string _extension;
puglic HandlerFactory(string extension){
_extension=extension;
}
public void GetHandler(string absolutePath){
switch(_extension){
case "ashx":
return AshxHandler(absolutePath);
break;
case "aspx"
return ASPXHandler(absolutePath);
break;
}
}
}
现在HttpApplication 就不再与任何具体的处理程序耦合了,因为HttpApplication把具体的工作交给了HandlerFactory,HandlerFactory会根据请求报文的url扩展名来创建相应的处理程序。
仔细观察HandlerFactory的GetHandler会发现,他只能创建处理ashx和aspx扩展名的处理程序,如果将来出现了新的扩展名,那么就需要修改HttpHandler以创建一个新的处理程序,这毫无疑问会影响到HttpApplication,因为HttpApplication在使用HandlerFactory。
为了隔离这种变化,我们修改HandlerFactory类,如下所示:
class HandlerFactory{
IHttpHandler GetHandler(String absolutePath){
//根据扩展名,从配置文件读取处理程序的信息。
HandlerInfo handlerInfo= ("c:\handler\register.config",_extension);
//加载处理程序所在的程序集
Assembly assem= Assembly.Load(handlerInfo.AssemblyName);
//利用反射创建处理程序对象。
return (IHttpHandler)assem.CreateInstance(handlerInfo.FullTypeName);
}
}
现在,如果想要处理一个名为.globol的处理程序。只需要在c:\handler\register.config中写入如下信息即可:
<extension=".globle",typeName="GlobleHandler",assembly="c:\handler\GlobleHandler">
extension是要处理的url扩展名,typeName是处理程序的类型名,assembly是处理程序所在的程序集。
OK,现在HttpApplication不仅可以可以处理ashx,aspx,还可以处理任何你指定的文件类型,前提是,你必须实现一个对象的处理程序,并在配置文件中注册。