使用asp.net HTTPHandler实现我自己的代码,然后调用其默认实现?

时间:2012-10-06 13:25:45

标签: asp.net http httphandler httpresponse

我遇到了一些问题,我在web.config文件中创建了一个我用作aspx的HTTPHandler的类型,代码..

<add path="*.aspx" verb="*" type="myHandler"></add>

cs页面是

public class myHandler :  IHttpHandler
{
    public void ProcessRequest(System.Web.HttpContext context) 
    {
        // check if client browser can accept gzip encoding
        string AcceptEncoding = context.Request.Headers["Accept-Encoding"];
        if (!string.IsNullOrEmpty(AcceptEncoding) && AcceptEncoding.Contains("gzip"))
        {
            // if yes, apply it
            context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
            context.Response.AddHeader("Content-Encoding", "gzip");
        }
        // don't do anything else, just let the default page handling work
    }

    public bool IsReusable
    {
        get { return false; }
    }

}

正如您所看到的,我正在检查客户端是否接受gzip编码,如果是,则添加它,并让默认进程处理... 但是我得到的回应是......

XML Parsing Error: no element found
Location: http://localhost:49903/Masters/Default.aspx
Line Number 1, Column 1:
^

每个页面都返回此错误?我猜测在我处理完处理程序中的请求后,它会以某种方式清除其他所有内容或相关内容。

Firebug显示以下内容..

Response Headers

Cache-Control   private
Connection  Close
Content-Encoding    gzip
Content-Length  0
Date    Sat, 06 Oct 2012 13:14:50 GMT
Server  ASP.NET Development Server/10.0.0.0
X-AspNet-Version    4.0.30319


Request Headers

Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection  keep-alive
Cookie  ASP.NET_SessionId=1wfoaqta3mosntii1c3ual1i; .ASPXAUTH=D41BBDC2CCF15048BB5A345EBBFBC63EAE35FD37E2F1F170C1D68495477889A989353D4EB30F2B9A723F83C21293A47478B654A1BD2453BCF032DC539427EA0E519D2FEE70DB7660F00AA90E159633C4
Host    localhost:49903
Referer http://localhost:49903/Masters/Default.aspx
User-Agent  Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0.1


Request Headers From Upload Stream

Content-Length  8241
Content-Type    multipart/form-data; boundary=---------------------------2995119424827

所以,根据我的猜测,我想知道有没有办法在我按照我的方式处理页面之后,我可以做一些像base.ProcessRequest()这样的事情。我知道它不可能,因为我正在实现一个接口而不是从一个类派生,但我想知道,在我完成后,我怎么能让asp.net引擎处理页面呢?

NB 这个问题不是关于实现gzib编码,我知道我可以在web配置,每个页面,IIS中设置它,在实用程序类中创建一个静态函数并调用它,以及许多其他的事情。但同样,请不要回答我可以用不同的方式来实现这个gzip编码,我知道我可以,我关心的是我怎么能让asp.net做它的默认处理(完成自定义处理后,或者其他任何意思?

1 个答案:

答案 0 :(得分:1)

你走错了路。您尝试使用的处理程序用于处理以不同扩展名结尾的某种文件的完全不同的方式,通过添加.aspx然后您处理该页面而不允许asp.net处理页面

你应该做的是httpModule,例如:

这样的课程
public class gZipModule : IHttpModule
{
    void IHttpModule.Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void IHttpModule.Dispose()
    {
    }

    private void context_BeginRequest(object sender, EventArgs e)
    {
        // gzip here
    }
}

并在网络配置上:

<httpModules>
   <add type="gZipModule"  name="gZipModule" />
</httpModules>

或更简单,在global.asax点击Application_BeginRequest gZip

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    // check if the file is .aspx, then make gzip
    string cTheFile = HttpContext.Current.Request.Path;
    string sExtentionOfThisFile = System.IO.Path.GetExtension(cTheFile);

    if (sExtentionOfThisFile.Equals(".aspx", StringComparison.InvariantCultureIgnoreCase))
    {   
        // now make gZip
    }
}