2009-12-25 2 views

Répondre

-1

Téléchargez l'exemple de compression gzip et ajoutez-le à votre fichier Global.asax.

0

Ajoutez le code ci-dessous à Global.asax et placez-le dans votre répertoire racine.

<%@ 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> 
0

(Je l'ai utilisé cette technique pour un certain temps - d'où le code vb.net!)

Bien que la compression ne soit pas pris en charge par IIS 6.0, la plupart des navigateurs supporte la compression gzip de base et avertit le serveur de cette capacité en envoyant un en-tête dans chaque requête. Le morceau de code suivant montre comment utiliser l'espace de noms System.IO.Compression pour ajouter un filtre au flux de sortie qui compresse la sortie tout en vérifiant et en définissant les en-têtes corrects.

context.Response.Clear() 
context.Response.Buffer = True 

context.Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", fileName)) 
context.Response.ContentEncoding = Encoding.UTF8 

context.Response.Cache.SetCacheability(HttpCacheability.Private) 

'Compress the output as it may be very large 
'When flushing or closing+ending the stream, the compression filter does not have a chance to write the compression footer 
'Therefore, make sure the compression filter stream is closed before flushing 
AddCompression(context) 

context.Response.ContentType = "application/vnd.ms-excel" 'This example was an excel doc 

'Write to response 
context.Response.Write(your-data-here) 

'context.Response.Flush() 'Do not flush if using compression 
'context.Response.Close() 
context.Response.End() 

La méthode de AddCompression vérifie les en-têtes appropriés et ajoute un courant de filtre de compression à la sortie:

'Add compression to the response stream 
Public Sub AddCompression(ByVal context As HttpContext) 

    Dim acceptEncoding As String = context.Request.Headers("Accept-Encoding") 
    If acceptEncoding Is Nothing OrElse acceptEncoding.Length = 0 Then Return 

    'Convert to lower to check 
    acceptEncoding = acceptEncoding.ToLower 

    'Gzip or Compress compression 
    'Compress compression is quicker and performs better compression so try that first 
    If (acceptEncoding.Contains("deflate")) Then 

     context.Response.Filter = New DeflateStream(context.Response.Filter, CompressionMode.Compress) 
     context.Response.AppendHeader("Content-Encoding", "deflate") 

    ElseIf acceptEncoding.Contains("gzip") Then 

     context.Response.Filter = New GZipStream(context.Response.Filter, CompressionMode.Compress) 
     context.Response.AppendHeader("Content-Encoding", "gzip") 

    End If 

End Sub 
Questions connexes