自定义IHttpHandlerFactory

之前使用ajax技术时,曾经用过ajaxpro这个组件,之后改用了jquery+IHttpHandler,

但发现所有jquery的的请求都没有响应,分析后发现ajaxpro也是通过请求IHttpHandler

实现ajax的,因为web.config中配置有ajaxpro的httphandlers处理项,所以以.ashx

后缀的请求都被截获了,所以没有得到预期的响应。当时第一反应就是把两种不同的请求

区分开来,但又不想去改ajaxpro的源码,所以最后决定模仿它写一个自定义的处理。

原先以为可用随便创建一个handler再Server.Execute或者Transfer就行了,但发现

总是报错,原来Execute需要的类型是Page,虽然有些失望,但不放弃再查找一些资料,

直到发现了IHttpHandlerFactory。(都怪自己之前无认真看)不过在写IHttpHandlerFactory

的过程中又发现我要把原先的请求处理,必须要动态创建对应的handler实例,又查了资料,发现

BuildManager.CreateInstanceFromVirtualPath帮上了。于是写好生成dll,很好,一切都解决了。

 

Imports System.Web
Imports System.Web.Compilation

Namespace jQuery
    Public Class AjaxHandlerFactory
        Implements IHttpHandlerFactory

        Public Function GetHandler(ByVal context As System.Web.HttpContext, ByVal requestType As String, ByVal url As String, ByVal pathTranslated As String) As System.Web.IHttpHandler Implements System.Web.IHttpHandlerFactory.GetHandler
            Dim requestPath As String = context.Request.Path
            Dim handler As IHttpHandler = BuildManager.CreateInstanceFromVirtualPath(requestPath, GetType(IHttpHandler))
            Return handler
        End Function

        Public Sub ReleaseHandler(ByVal handler As System.Web.IHttpHandler) Implements System.Web.IHttpHandlerFactory.ReleaseHandler

        End Sub
    End Class
End Namespace

 

 <httpHandlers>
      <add  verb ="*" path="jqhandler/*.ashx" type ="MyHandler.jQuery.AjaxHandlerFactory,MyHandler" />
      <add verb="*" path="*.ashx" type="AjaxPro.AjaxHandlerFactory,AjaxPro.2"/>
    </httpHandlers>

 

 应该会有更简单的方法,想看下大家的意见。

posted @ 2010-04-07 13:53  liangzi.net  阅读(387)  评论(0编辑  收藏  举报