hello

HTTP处理程序介绍

ASP.NET HTTP处理程序是响应对ASP.NET Web应用程序的请求而运行的过程。常用的处理程序是处理.aspx文件的Asp.net页处理程序。用户请求.aspx文件时,页通过页处理程序来处理请求。

Asp.net页处理程序仅仅是一种类型的处理程序。Asp.net还包括其他几种内置的处理程序,例如用于.asmx文件的web服务处理程序。

Http处理程序可以访问应用程序上下文,包括请求用户的标识(如果已知)、应用程序状态和会话信息等。当请求Http处理程序时,ASP.NET将调用相应的应用程序上的ProcessRequest方法。处理程序的ProcessRequest方法创建一个响应,此响应随后发送回请求浏览器。就像任何页请求那样,响应将途经订阅了处理程序运行后所发生事件的所有HTTP模块。有关处理web服务器请求的更多信息,请参见ASP.NET应用程序生命周期概述。

ASP.NET中的内置HTTP处理程序

ASP.NET根据文件扩展名将HTTP请求映射到HTTP处理程序。每个HTTP处理程序都能够处理应用程序中的单个HTTP URL或者URL扩展名组。ASP.NET包括集中内置的HTTP处理程序,如下表:

处理程序

说明

ASP.NET 页处理程序 (*.aspx)

用于所有 ASP.NET 页的默认 HTTP 处理程序。

Web 服务处理程序 (*.asmx)

用于使用 ASP.NET 创建的 Web 服务页的默认 HTTP 处理程序。

ASP.NET 用户控件处理程序 (*.ascx)

用于所有 ASP.NET 用户控件页的默认 HTTP 处理程序。

跟踪处理程序 (trace.axd)

显示当前页跟踪信息的处理程序。有关详细信息,请参见如何:使用跟踪查看器查看 ASP.NET 跟踪信息

创建自定义的HTTP处理程序

若要创建一个自定义的HTTP处理程序,可以创建一个可实现IHttpHandle接口的类以创建同步处理程序。如下,我们对ASP.NET应用程序中其URL为.sample结尾的资源执行同步请求处理。主要有以下几个步骤:

  • 一个HTTP处理程序类的代码,该类必须继承IHttpHandle接口,并实现ProcessRequest方法和IsReusable属性
  •  Web.config文件中注册该处理程序并将.sample文件扩展名映射到该处理程序所需的元素
  •  在Internet服务器IIS中将.sample文件扩展名映射到ASP.NET

创建自定义MyHttpHandle HTTP处理程序类

namespace IHttpHandle_ProcessRequest
{
public class MyHttpHandler : IHttpHandler
{
    //override the IsReusable property
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    //override the ProcessRequest method
    public void ProcessRequest(HttpContext context)
    {
        context.Response.Write("<H1>This is an HttpHandler  
Test.</H1>");
        context.Response.Write("<p>Your Browser:</p>");
        context.Response.Write("Type: " + context.Request.Browser.Type  
+ "<br>");
        context.Response.Write("Version: " +  
context.Request.Browser.Version);
    }
}
}

 

在Web.config文件中注册自定义HTTP处理程序

在<system.web>中添加 

  <httpHandlers>
      <add verb="*" path="*.sample " type="IHttpHandle_ProcessRequest.MyHttpHandler"/>
</httpHandlers>

 

其中type值格式为namespace.classname,如果是namespace为空,那么直接classname就可以了。

 

在IIS中配置HTTP处理程序扩展名

IIS只将针对某些文件类型的请求传递给ASP.NET进行处理。默认情况,具有.aspx,.ascx,.asmx等文件扩展名的文件在IIS中已映射为ASP.NET ISAPI扩展名(Asp.net_isapi.dll)。但如果希望ASP.NET处理自定义URL扩展名,则必须在IIS中映射这些扩展名。

在不同IIS种映射扩展名方法稍有差异,以IIS6.0为例。

  1. 打开IIS服务器
  2. 右击应用程序的名称,然后单击属性
  3. 单击“虚拟目录”选项卡,然后单击”配置”
  4. 在”映射”选项卡上,单击添加,将显示“添加/编辑应用程序扩展名映射”对话框
  5. 在”可执行文件”框中,输入或浏览选择aspnet_isapi.dll文件。默认情况下,该文件在以下位置:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

如果是4.0框架,则在:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319目录下。

这里我们可以做其它映射,(如.aspx,.html文件的映射)或者完整路径和文件名,很多伪静态就是这种方式,但是弊端就是页面中本身的.html静态文件也会被aspnet_isapi.dll文件执行而出现错误,所以我们可以设静态文件后缀为.htm,避免冲突。

     6.在”扩展名”框中,键入.sample

     7.清除”确认文件是否存在”复选框

     8.单击确定,然后关闭IIS管理器

 

测试,如下图:

 

这里我们输入team.sample,则首先会执行MyHttpHandler类中ProcessRequest方法的代码。

而事实上,team.sample文件是不存在的。

 

我们也可以创建一个实现IHttpAsyncHandler的类以创建异步处理程序。两种处理程序接口都要求您实现IsReusable属性和ProcessRequest方法。IsReusable属性指定IHttpHandlerFactory对象是否可以将你的处理程序放置在池中,并且重新使用它们以提高性能,或是否在每次需要处理程序时都必须创建实例。ProcessRequest方法负责处理单个HTTP请求。

 

创建MyHttpAsyncHandler 处理程序类

1. MyHttpAsyncHandler类

namespace IHttpHandle_ProcessRequest
{
    public class MyHttpAsyncHandler:IHttpAsyncHandler
    {
        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            context.Response.Write("<p>Begin IsThreadPoolThread is: " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n");
            AsynchOperation asynch = new AsynchOperation(cb, context, extraData);
            asynch.StartAsyncWork();
            return asynch;
        }

        public void EndProcessRequest(IAsyncResult result)
        {
            
        }

        public bool IsReusable
        {
            get { return false; }
        }

        public void ProcessRequest(HttpContext context)
        {
            throw new InvalidOperationException();
        }
    }
}

2. AsynchOperation类

namespace IHttpHandle_ProcessRequest
{
    public class AsynchOperation:IAsyncResult
    {
        private object _state;
        private bool _completed;
        private AsyncCallback _callback;
        private HttpContext _context;

        public object AsyncState
        {
            get { return this._state; }
        }

        public WaitHandle AsyncWaitHandle
        {
            get { return null; }
        }

        public bool CompletedSynchronously
        {
            get { return false; }
        }

        public bool IsCompleted
        {
            get { return this._completed; }
        }

        public AsynchOperation(AsyncCallback callback, HttpContext context, Object state)
        {
            _callback = callback;
            _context = context;
            _state = state;
            _completed = false;
        }

        public void StartAsyncWork()
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncWork),null);
        }

        private void StartAsyncWork(object workItemState)
        {
            _context.Response.Write("<p>Completion IsThreadPoolThread is: " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n");

            _context.Response.Write("Hello World from Async Handler!");
            _completed = true;
            _callback(this);
        }
    }
}

上述代码实现BeginProcessRequest方法,该方法向当前的HttpContext对象的Response属性写入一个字符串,创建一个AsynchOperation类的新实例,然后调用StartAsyncWork方法。然后,StartAsyncWork方法向ThreadPool对象添加StartAsyncTask委托。当有线程可用时,将调用StartAsyncTask方法,该方法向Response属性写出另外一个字符串,然后通过调用AsyncCallback委托完成该任务。

 

注册自定义的HTTP处理程序

在web.config文件中注册自定义的Http处理程序

  <httpHandlers>
      <add verb="*" path="*.sampleAsync" type="IHttpHandle_ProcessRequest.MyHttpAsyncHandler"/>
</httpHandlers>

IIS中添加映射扩展名同创建同步HTTP处理程序一样。

 

测试,如下图:

同步和异步HTTP处理程序的区别

利用异步HTTP处理程序可以启动一个外部进程(例如对远程服务器的方法调用),然后继续处理程序的处理工作,而无需等待外部进程结束。在异步HTTP处理程序的处理期间,ASP.NET将通常用于外部进程的线程放回线程池中,直到处理程序收到来自外部进程的回调。这样可以避免阻止线程,并大幅改善了性能,因为一次所能执行的线程数量是有限的。如果许多用户都在请求依赖于外部进程的同步HTTP处理程序,那么操作系统可能很快用完所有线程,因为大量线程被阻止,正在等待外部进程。

创建异步处理程序时,除了实现IHttpAsyncHandler接口,还必须实现BeginProcessRequest以启动异步调用处理单个HTTP请求,还必须实现EndProcessRequest方法,以便在进程结束时运行清理代码。

自定义IHttpHandlerFactory

IHttpHandleFactory接口用于创建和管理处理请求的HTTP处理程序。因此,可以创建一个实现IHttpHandlerFactory接口的类,然后将该类用作HTTP处理程序。这样可以更好的控制对HTTP请求的处理,因为这样可以将URL映射到基于一组复杂条件创建不同处理程序的HTTP处理程序工厂。例如,使用HTTP处理程序工厂可以创建访问昂贵或有限资源(如数据库连接)的数量有限的HTTP处理程序对象,然后在以后的请求中重用这些处理程序对象。

在下面的实例中,使用HTTP处理程序工厂为用扩展名.sample标识的资源创建了两个应用程序,一个用于HTTP GET请求,另一个用于HTTP POST请求。

创建自定义的HTTP处理程序工厂

namespace IHttpHandle_ProcessRequest
{
    public class HandlerFactory:IHttpHandlerFactory
    {
        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            IHttpHandler handlerReturn;
            if ("get" == context.Request.RequestType.ToLower())
            {
                handlerReturn = new MyHttpHandler();
            }
            else if ("post" == context.Request.RequestType.ToLower())
            {
                handlerReturn = new MyHttpAsyncHandler();
            }
            else
            {
                handlerReturn = null;
            }
            return handlerReturn;
        }

        public void ReleaseHandler(IHttpHandler handler)
        {
            
        }
    }
}

这段代码实现IHttpHandlerFactory接口的GetHandler方法,并在请求为get时返回所创建的同步处理程序,如果请求为post,则返回异步处理程序。

注册自定义HTTP处理程序工厂

 

在web.config中注册:
    <httpHandlers>
      <add verb="*" path="*.sample" type="IHttpHandle_ProcessRequest.HandlerFactory"/>
</httpHandlers>

IIS添加映射方法同上

测试自定义HTTP处理程序工厂

  1. 在程序中添加一个html页面
  2. 在该页的body中,添加如下代码:
 <form action="Sample.sample" method="get">
    <input type="submit" value="Submit to Sample.sample via Get" />
    </form>
    <br />
    <form action="Sample.sample" method="post">
    <input type="submit" value="Submit to Sample.sample via Post" />
</form>

测试效果如图:

点击按钮提交后

posted @ 2013-05-07 16:30  B追风少年  阅读(469)  评论(0编辑  收藏  举报

hello too