C#如何压缩.ashx内容?

Mar*_*ijn 8 c# asp.net

在我的Web应用程序中,我使用ashx文件将文件写入浏览器.我注意到.ashx文件没有压缩,但仅限于.aspx文件.

是否可以压缩.ashx?如果有可能,怎么样?

目前我使用global.asax来处理压缩:

<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>

<script runat="server">
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
    HttpApplication app = sender as HttpApplication;
    string acceptEncoding = app.Request.Headers["Accept-Encoding"];
    Stream prevUncompressedStream = app.Response.Filter;

    if (!(app.Context.CurrentHandler is Page ||
        app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
        app.Request["HTTP_X_MICROSOFTAJAX"] != null)
        return;

    if (acceptEncoding == null || acceptEncoding.Length == 0)
        return;

    acceptEncoding = acceptEncoding.ToLower();

    if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
    {
        // defalte
        app.Response.Filter = new DeflateStream(prevUncompressedStream,
            CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "deflate");
    } else if (acceptEncoding.Contains("gzip"))
    {
        // gzip
        app.Response.Filter = new GZipStream(prevUncompressedStream,
            CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "gzip");
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

除了我的.ashx文件之外,这会压缩所有内容.谁能帮我?

因为我创建了一个.ashx文件,所以我自动创建了一个新类型(我的案例ViewMht).这种类型没有通过第一个if语句:

    if (!(app.Context.CurrentHandler is Page ||
        app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
        app.Request["HTTP_X_MICROSOFTAJAX"] != null)
        return;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,只有从'Page'继承的文件被压缩,而我的ashx文件不是Page的类型.所以我添加了一个条件,现在它的工作正常:

if (!(app.Context.CurrentHandler is Page ||
      app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler" ||
      app.Context.CurrentHandler is ViewMht // This is the type I had to add
      ) ||
      app.Request["HTTP_X_MICROSOFTAJAX"] != null)
        return;
Run Code Online (Sandbox Code Playgroud)

Ari*_*tos 1

如果您的压缩是在 Global.asax 上完成的,那么您需要将压缩代码放在这里,以告诉您需要对程序进行哪些更改。

可能对文件扩展名进行了检查。