【发布时间】:2011-02-26 21:15:46
【问题描述】:
在我的 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>
这会压缩除我的 .ashx 文件之外的所有内容。谁能帮帮我?
解决方案
因为我创建了一个 .ashx 文件,所以我自动创建了一个新类型(我的例子是 ViewMht)。这种类型没有通过第一个 if 语句:
if (!(app.Context.CurrentHandler is Page ||
app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
app.Request["HTTP_X_MICROSOFTAJAX"] != null)
return;
如您所见,只有从“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;
【问题讨论】:
-
如果您的压缩是在 Global.asax 上完成的,那么您需要将压缩代码放在这里,告诉您需要对程序进行哪些更改。可能对文件扩展名进行了检查。
-
@Aristos。多亏了你,我找到了解决方案。问题是它没有通过第一个 if 状态,因为我的 .ashx 文件属于检查中没有出现的类型。所以我将我的类型添加为有效类型,现在页面被压缩。如果您可以发布答案,我可以投票并回答。
-
谢谢你的信息,我已经发布了一个答案。