En mi aplicación web, uso un archivo ashx para escribir un archivo en el navegador. Me di cuenta de que no hay compresión sobre el archivo .ashx, pero solo sobre mis archivos .aspx.C# Cómo comprimir el contenido .ashx?
¿Es posible comprimir .ashx? Y si es posible, ¿cómo?
Actualmente uso Global.asax para manejar la compresión:
<%@ 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>
Esto comprime de todo menos mis archivos .ashx. ¿Quién puede ayudarme?
SOLUCIÓN
Debido a que he creado un archivo .ashx que crea automáticamente un nuevo tipo (mi caso ViewMht). Este tipo no vino a través de la primera sentencia if:
if (!(app.Context.CurrentHandler is Page ||
app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
app.Request["HTTP_X_MICROSOFTAJAX"] != null)
return;
Como se puede ver sólo los archivos que heredan de 'Página' son comprimidos y el archivo de ashx no es del tipo de página. Por lo que añade una condición y ahora funciona muy bien:
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;
si su compresión se realiza en Global.asax, entonces debe colocar el código de la compresión aquí para decirle lo que necesita cambiar en su programa. Probablemente hay un control en la extensión del archivo. – Aristos
@Aristos. Encontré la solución gracias a ti. El problema fue que no pasó el primer estado si porque mi archivo .ashx es de un tipo que no aparece en el cheque. Entonces agregué mi tipo como válido y ahora la página está comprimida. Si puede publicar una respuesta, puedo votar y responderla. – Martijn
Gracias por la información, he publicado una respuesta. – Aristos