WebAPI Gzip lors du retour de HttpResponseMessage
J'ai un WebAPI contrôleur qui renvoie un HttpResponseMessage
et je tiens à ajouter de la compression gzip. C'est le code du serveur:
using System.Net.Http;
using System.Web.Http;
using System.Web;
using System.IO.Compression;
[Route("SomeRoute")]
public HttpResponseMessage Post([FromBody] string value)
{
HttpContext context = HttpContext.Current;
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;
return new SomeClass().SomeRequest(value);
}
Et c'est le code client pour l'appel ajax, à l'aide de jquery:
$.ajax({
url: "/SomeRoute",
type: "POST",
cache: "false",
data: SomeData,
beforeSend: function (jqXHR) { jqXHR.setRequestHeader('Accept-Encoding', 'gzip'); },
success: function(msg) { ... }
Lorsque je l'exécute, le code du serveur renvoie sans énerve mais le client bugs:
(failed)
net::ERR_CONTENT_DECODING_FAILED
Quand je regarde avec un violon, c'est ce que je vois:
Que dois-je modifier pour que le service web retour au format gzip contenu que le client traite normalement? Je sais que je pourrais aussi le faire avec un HttpModule ou par l'intermédiaire de certains paramètres sur IIS, mais aucune option ne s'adapte le scénario de l'hébergement:
Veuillez noter que je ne suis pas à la recherche d'un IIS, car je n'ai pas accès à ce (hébergement).
- Avez-vous regardé ce? stackoverflow.com/a/10446108/263003
- jetez un oeil à weblog.west-wind.com/posts/2012/Apr/28/...
- J'espérais que je pourrais le faire en beaucoup moins d'étapes.
- Cochez cette - stackoverflow.com/a/3653766/2164198 et essayez d'utiliser suggéré wrapper pour éviter un comportement indésirable. Voir aussi cette réponse stackoverflow.com/a/7629079/2164198
- Par les regards de lui, vous pouvez le faire directement sur IIS. Le lien est un peu vieux --- stackoverflow.com/questions/702124/enable-iis7-gzip
- Note: je ne suis PAS à la recherche d'un IIS, car je n'ai pas accès à ce (hébergement).
- Votre question n'est pas de parler de l'iis contrainte, donc je l'ai ajouté.
- Avez-vous vu ceci: blogs.msdn.com/b/kiranchalla/archive/2012/09/04/...
Vous devez vous connecter pour publier un commentaire.
Si vous avez accès à la configuration de IIS
Vous ne pouvez pas il suffit d'appliquer l'en-tête et nous espérons qu'il sera au format gzip - la réponse ne sera pas zippé.
Vous avez besoin de supprimer l'en-tête que vous avez ajouté et vous assurer que vous avez la compression dynamique et statique de la compression de contenu sont activés sur votre serveur IIS.
L'un des intervenant a mentionné une bonne ressource lien ici à stakoverflow qui montrent comment le faire:
Activer gzip IIS7
Remarque, il ne fonctionnera que le réglage de la valeur dans le web.config si la compression dynamique est déjà installé (ce qui n'est pas dans une installation par défaut de IIS)
Vous pouvez trouver les informations à ce sujet dans la documentation MSDN: http://www.iis.net/configreference/system.webserver/httpcompression
La compression Simple
Ci-dessous à l'aide d'un exemple simple de faire votre propre de compression de cet exemple est l'aide de l'Api Web MVC 4 projet à partir de modèles de projet visual studio. Pour obtenir la compression de travail pour HttpResponseMessages vous avez à mettre en œuvre une coutume MessageHandler. Voir ci-dessous un exemple de travail.
Voir la mise en œuvre du code ci-dessous.
Veuillez noter que j'ai essayé de garder la méthode de faire la même chose que votre exemple.
Également ajouter le nouveau gestionnaire de messages pour la config de votre application.
Le gestionnaire Personnalisé a été mis en place par Kiran Challa (http://blogs.msdn.com/b/kiranchalla/archive/2012/09/04/handling-compression-accept-encoding-sample.aspx)
Il y a de meilleurs exemples qui mettent en œuvre le dégonflage de l'inbound flux de trop, vous pouvez voir des exemples de ce que ci-dessous:
En outre, j'ai trouvé un très beau projet qui prend en charge le tout sur github.
Remarque alors que je suis arrivé à cette réponse par moi-même Simon dans vos commentaires ont suggéré cette approche il ya 2 jours à compter de la date de cette réponse.
Ajouter ces packages NuGet:
Puis et ajouter une ligne de code pour
App_Start\WebApiConfig.cs
:Qui va faire l'affaire!
Plus de détails à:
Espère que ça aide.
**Mise à jour après le commentaire de @JCisar
Mise à jour pour ASP.Net Core
Package Nuget est
config.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
dans leRegister
méthodeUne Solution sans la modification d'un Paramètre IIS ou l'Installation de tout Nuget package consiste à ajouter un MessageHandler à votre site WEB API.
Cela permettra de récupérer les requêtes avec le "AcceptEncoding" en-Tête et les compresser à l'aide de la Construire dans Système.IO.La Compression bibliothèques.
Et d'ajouter cette fonction à votre Global.asax.cs
Bravo à Ben Foster.
ASP.NET l'API Web de Compression
Juste un addendum à l'activation de la compression dans IIS via le
applicationHost.config
fichier.Utilisez le gestionnaire de configuration de IIS pour faire les changements ou
notepad.exe
à éditer le fichier. J'ai été en utilisantNotepad++
et même si le fichier a été d'économie, il n'était effectivement pas.Quelque chose à voir avec 32/64bit environnements, les configs et les programmes qui les éditer. Ruiné mon après-midi!!