Soluciones y problemas de compresión GZip habilitados para IIS El archivo de página

  
es relativamente grande, la compresión GZip abierta puede reducir la transmisión de tráfico, probar el efecto es muy obvio, leer el software de la computadora y los usuarios de la red de aplicaciones de hardware algunas personas usan IIS Función de compresión GZip, esta función también se aplica en el proyecto. En el proceso de uso, encontré un problema bastante difícil. He estado buscando durante mucho tiempo.
En el proyecto, el archivo de informe de Excel2007 se genera en el lado del servidor. Después de que el archivo se descarga en el local, no se puede abrir normalmente. El formato del archivo es defectuoso. Debido a que la esencia del formato de archivo de Excel2007 es un paquete comprimido, se sospecha que el archivo se está descargando. Cambiado, pero no sé qué parte del problema. Supongo que: 1. Dado que el archivo Excel2007 se imprime cuando se procesa la página y la solicitud de finalización está directamente después de la salida, puede deducir el mecanismo de compresión de IIS. Debe agregarse al comienzo de la solicitud, no al final de la solicitud. Comprimido 2. Cuando se descargue el archivo, se abrirá el cuadro de descarga para su descarga y el navegador no podrá descomprimirlo. Esto aún no se ha verificado. O existen otras razones por las que el paquete de compresión no se puede presurizar, porque el paquete de compresión se empaqueta dos veces (el archivo Excel2007 se empacó una vez y se empacó una vez más cuando se descargó a través de IIS). El problema de usar la compresión IIS (encontrado actualmente): 1. La configuración es inconveniente. Para cambiar el archivo de configuración en el sistema, si no hay suficiente permiso, no hay forma de configurarlo. 2. IIS6 afectará a todos los sitios en IIS, se dice que IIS7 no tiene este problema. 3. Configuró la máquina comprimida IIS, la configuración se pierde después de algunos reinicios (cosas extrañas). 4. Problema de descarga de Excel2007, se estima que habrá problemas en el formato OOXML. Solución: la solución es usar HttpModule para la compresión, usar el evento PostReleaseRequestState en HttpModule para comprimir, retrasar el tiempo de compresión al Render, el código habitual no desinstalará el Render :) Ya que el evento PostReleaseRequestState es después del Render Alguien tendrá dudas, también se puede suscribir en la página. En mi prueba real, encontré que no puedo cambiar el filtro de respuesta en la lógica de la página. Informaré un error. Esto puede implicar algunos permisos en asp.net. Por lo tanto, todavía honestamente implementarlo en HttpModule. Uso del sistema;
mediante System.Collections.Generic;
que usa System.Text;
using System.Web;
using System.IO;
using System.IO.Compression;

namespace CapabilityTest
{
clase pública CompressModule: IHttpModule
{
#region IHttpModule Members

public void Dispose ()
{
//arrojar nuevo NotImplementedException ();
}

Public void Init (HttpApplication context)
{
context.PostReleaseRequestState + = new EventHandler (context_PostReleaseRequestState);
}

#BR> # Endregion

private const string GZIP = "gzip";
private const string DEFLATE = "deflate";

private void context_PostReleaseRequestState (emisor de objetos, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
Stream filter = app.Response.Filter;

if (IsEncodingAccepted (app.Request, GZIP))
{
app.Response.Filter = new GZipStream (filter, CompressionMode.Compress);
app.Response.AppendHeader ("Content-Encoding", GZIP);
}
else if (IsEncodingAccepted ( app.Request, DEFLATE))
{
app.Response.Filter = new DeflateStream (filter, CompressionMode.Compress);
app.Response.AppendHeader ("Content-Encoding", DEFLATE);
}
}

bool estático privado IsEncodingAccepted (solicitud HttpRequest, codificación de cadena)
{
cadena acceptEncoding = request.Headers ["Accept-Encoding"];
if (acceptEncoding == nulo)
devuelve false;

acceptEncoding = acceptEncoding.ToLower ();
if (encoding == GZIP)
return acceptEncoding.Contains (GZIP) | |  acceptEncoding.Contains ("x-gzip") | |  acceptEncoding.Contains ("*");

if (encoding == DEFLATE)
devuelve acceptEncoding.Contains (DEFLATE);

devuelve false;
}
}
} Mejoras: 1. Puede agregar un ConfigurationSection personalizado al archivo de configuración, usar el método de configuración para comprimir la extensión de archivo especificada o excluir la compresión de la extensión de archivo especificada. 2. En la red, vi a alguien diciendo que quiero lidiar con el AJAX de Microsoft. No puedo comprimirlo. El método de juicio es: return (app.Request ["HTTP_X_MICROSOFTAJAX"]! = Null | |  app.Request ["Anthem_CallBack"]! = null); 3. Comprime o descomprime la página que implementa una clase o interfaz base: ICompressable p = app.Context.Handler como ICompressable; return (p == null ); Además: este artículo para IIS6, el último IIS7 no se ha experimentado personalmente, no se sabe cómo hacerlo bien en la compresión. El evento PostReleaseRequestState mencionado en el artículo solo se admite en asp.net 2.x, por lo que no se puede usar para el proyecto desarrollado por vs2003.
Copyright © Conocimiento de Windows All Rights Reserved