La compression gzip peut-elle être désactivée sélectivement dans ASP.NET/IIS 7?

J’utilise une connexion HTTP asynchrone de longue durée pour envoyer des mises à jour de progression à un client via AJAX. Lorsque la compression est activée, les mises à jour ne sont pas reçues en morceaux discrets (pour des raisons évidentes). Désactiver la compression (en ajoutant un élément à ) résout le problème:

  

Cependant, cela désactive la compression à l’échelle du site. Je souhaite préserver la compression pour tous les autres contrôleurs et / ou actions sauf celui-ci. Est-ce possible? Ou vais-je devoir créer un nouveau site / zone avec son propre web.config? Toutes les suggestions sont les bienvenues.

PS le code qui écrit dans la réponse HTTP est:

 var response = HttpContext.Response; response.Write(s); response.Flush(); 

    La réponse de @Aristos fonctionnera pour WebForms, mais avec son aide, j’ai adapté une solution plus en ligne avec la méthodologie ASP.NET/MVC.

    Créez un nouveau filtre pour fournir la fonctionnalité gzipping:

     public class GzipFilter : ActionFilterAtsortingbute { public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); var context = filterContext.HttpContext; if (filterContext.Exception == null && context.Response.Filter != null && !filterContext.ActionDescriptor.IsDefined(typeof(NoGzipAtsortingbute), true)) { ssortingng acceptEncoding = context.Request.Headers["Accept-Encoding"].ToLower();; if (acceptEncoding.Contains("gzip")) { context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); context.Response.AppendHeader("Content-Encoding", "gzip"); } else if (acceptEncoding.Contains("deflate")) { context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress); context.Response.AppendHeader("Content-Encoding", "deflate"); } } } } 

    Créez l’atsortingbut NoGzip :

     public class NoGzipAtsortingbute : Atsortingbute { } 

    Empêcher IIS7 de gzipping à l’aide de web.config:

      ...   

    Enregistrez votre filtre global dans Global.asax.cs:

     protected void Application_Start() { ... GlobalFilters.Filters.Add(new GzipFilter()); } 

    Enfin, NoGzip atsortingbut NoGzip :

     public class MyController : AsyncController { [NoGzip] [NoAsyncTimeout] public void GetProgress(int id) { AsyncManager.OutstandingOperations.Increment(); ... } public ActionResult GetProgressCompleted() { ... } } 

    PS Encore une fois, merci beaucoup à @Aristos pour son idée et sa solution.

    J’ai trouvé un moyen beaucoup plus facile de faire cela. Au lieu d’effectuer votre propre compression de manière sélective, vous pouvez désactiver de manière sélective la compression IIS par défaut (en supposant qu’elle soit activée dans votre fichier web.config).

    Supprimez simplement l’en-tête de codage accept-encoding sur la demande et IIS ne compressera pas la page.

    (global.asax.cs 🙂

     protected void Application_BeginRequest(object sender, EventArgs e) { try { HttpContext.Current.Request.Headers["Accept-Encoding"] = ""; } catch(Exception){} } 

    Et si vous définissiez vous-même la compression gzip, sélectionnez-la quand vous le souhaitez? Sur le Application_BeginRequest vérifier quand vous voulez faire et quand vous ne faites pas la compression. Voici un exemple de code.

     protected void Application_BeginRequest(Object sender, EventArgs e) { ssortingng cTheFile = HttpContext.Current.Request.Path; ssortingng sExtentionOfThisFile = System.IO.Path.GetExtension(cTheFile); if (sExtentionOfThisFile.Equals(".aspx", SsortingngComparison.InvariantCultureIgnoreCase)) { ssortingng acceptEncoding = MyCurrentContent.Request.Headers["Accept-Encoding"].ToLower();; if (acceptEncoding.Contains("deflate") || acceptEncoding == "*") { // defalte HttpContext.Current.Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress); HttpContext.Current.Response.AppendHeader("Content-Encoding", "deflate"); } else if (acceptEncoding.Contains("gzip")) { // gzip HttpContext.Current.Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress); HttpContext.Current.Response.AppendHeader("Content-Encoding", "gzip"); } } }