2010-03-19 5 views
1

J'ai écrit un IHttpModule qui compresse ma réponse en utilisant gzip (je retourne beaucoup de données.) Afin de réduire la taille de la réponse. Cela fonctionne très bien tant que le service Web ne lance pas d'exception. En cas d'exception, l'exception est gzippée mais l'en-tête Content-encoding disparaît et le client ne sait pas lire l'exception.Demande de compression

Pourquoi l'en-tête est-il manquant? J'ai besoin d'obtenir l'exception chez le client.

Voici le module:

public class JsonCompressionModule : IHttpModule 
{ 
    public JsonCompressionModule() 
    { 
    } 

    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication app) 
    { 
     app.BeginRequest += new EventHandler(Compress); 
    } 

    private void Compress(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     HttpRequest request = app.Request; 
     HttpResponse response = app.Response; 
     try 
     { 
      //Ajax Web Service request is always starts with application/json 
      if (request.ContentType.ToLower(CultureInfo.InvariantCulture).StartsWith("application/json")) 
      { 
       //User may be using an older version of IE which does not support compression, so skip those 
       if (!((request.Browser.IsBrowser("IE")) && (request.Browser.MajorVersion <= 6))) 
       { 
        string acceptEncoding = request.Headers["Accept-Encoding"]; 

        if (!string.IsNullOrEmpty(acceptEncoding)) 
        { 
         acceptEncoding = acceptEncoding.ToLower(CultureInfo.InvariantCulture); 

         if (acceptEncoding.Contains("gzip")) 
         { 
          response.AddHeader("Content-encoding", "gzip"); 
          response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); 
         } 
         else if (acceptEncoding.Contains("deflate")) 
         { 
          response.AddHeader("Content-encoding", "deflate"); 
          response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      int i = 4; 
     } 
    } 
} 

Voici le service Web:

[WebMethod] 
public void DoSomething() 
{ 
    throw new Exception("This message get currupted on the client because the client doesn't know it gzipped."); 
} 
+0

S'il vous plaît aider? Vous n'avez pas besoin de le mentionner car c'est l'objet même de ce site Web. –

Répondre

0

Vous devriez essayer de faire face à l'exception de Page_Error ou Application_Error gestionnaires d'événements. Je ne sais pas ce qu'il advient de l'en-tête, mais vous pouvez probablement simuler et déboguer la méthode Compress en divisant par zéro dans votre application.

Vérifiez ce link à propos de la gestion globale d'exception dans ASP.NET

+0

Dans le cas où mon webservice lève une exception, j'aimerais que le client reçoive cette exception sous le rappel "error". En cas d'exception, je ne veux pas traiter le résultat comme un succès. – Naor

+0

Alors pourquoi ne traitez-vous pas l'exception sur votre chemin et puis le ré-écrire – tsinik

+0

C'est exactement ce que je suis dong, mais je le fais dans le service Web spécifique et pas sous l'événement page_error. – Naor