• 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>

    测试效果如图:

    点击按钮提交后

  • 相关阅读:
    lecture 11.4
    lecture 10.30
    boolean functions and beyon
    lecture10.21
    golang hex to string
    golang中 将string转化为json
    ubuntu16报错: add-apt-repository command not found
    ubuntu16的防火墙关闭
    ubuntu 16 解决错误 manpath: can't set the locale; make sure $LC_* and $LANG are correct
    go get 安装时报 (https fetch: Get https://golang.org/x/crypto/acme/autocert?go-get=1: dial tcp 220.255.2.153:443: i/o timeout)
  • 原文地址:https://www.cnblogs.com/bianlan/p/3064981.html
Copyright © 2020-2023  润新知