2010-06-02 22 views
8

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; 
+2

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

+0

@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

+0

Gracias por la información, he publicado una respuesta. – Aristos

Respuesta

1

Si su compresión se realiza en Global.asax, entonces tienes que colocar el código de la compresión aquí para decirle lo que necesita cambiar en su programa.

Probablemente haya una verificación de la extensión del archivo.

0
+0

¿No es posible hacer esto en el archivo global.asax? Porque aquí es donde tiene lugar mi compresión .aspx. – Martijn

+0

He configurado la compresión en IIS, pero mis archivos ashx aún no se comprimen. Todos mis otros archivos están comprimidos, pero los archivos .ashx no están comprimidos. – Martijn