2011-11-08 37 views
0

ウェブアプリケーションでサーバエラーが発生した場合、実際のエラーメッセージではなくgzipされたサーバエラーが画面に表示されるという問題が発生しています。私はGZIP Decompress on Application_Errorを呼び出してこれを解決しようとしています。アプリケーションのエラーで応答を解凍するにはどうすればよいですか?

HttpContext.Current.Responseストリームが解読できないため、解凍できません。つまり、CanReadはfalseですが、CanWriteはtrueです。これは、私が何か完全に間違っていると信じさせてしまうので、私は提案も受け入れています。

protected void Application_Error(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Error != null) 
    { 
     this.GetType().GetLogger().Error(HttpContext.Current.Error); 
    } 

    CompressionManager.Decompress(); 
} 

public static void Decompress() 
{ 
    //Determine types of compression possible. 
    string acceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"]; 
    if (string.IsNullOrEmpty(acceptEncoding)) return; 

    //Make sure the stream is actually compressed. 
    HttpResponse response = HttpContext.Current.Response; 
    bool compressed = response.Headers.AllKeys.Contains("Content-encoding"); 
    if (!compressed) return; 

    acceptEncoding = acceptEncoding.ToUpperInvariant(); 

    using (MemoryStream memStream = new MemoryStream()) 
    { 
     byte[] buffer = new byte[1024]; 
     int byteCount; 
     do 
     { 
      byteCount = response.Read(buffer, 0, buffer.Length); 
      memStream.Write(buffer, 0, byteCount); 
     } while (byteCount > 0); 

     // If you're going to be reading from the stream afterwords you're going to want to seek back to the beginning. 
     memStream.Seek(0, SeekOrigin.Begin); 

     if (acceptEncoding.Contains("GZIP")) 
     { 
      using (GZipStream decompress = new GZipStream(memStream, CompressionMode.Decompress)) 
      { 
       decompress.CopyTo(response.Filter); 
      } 
     } 
     else if (acceptEncoding.Contains("DEFLATE")) 
     { 
      response.Filter = new DeflateStream(response.Filter, CompressionMode.Decompress); 
     } 

     response.Headers.Remove("Content-encoding"); 
    } 
} 

私は今しばらくの間、グーグルでてきたが、はるかに進歩を遂げていません。限り私は "Request.GetResponseStream()"と応答オブジェクトではなく、私はGetResponseStreamは非静的な要求を必要と思うと思うと私は言うことができます。

何かを開いてください。ありがとう。

Derp。私はあなたがResponse.Clearを行う示唆してデータを送信、その後、適切なヘッダを設定します

CompressionManager.Decompress(HttpContext.Current.Error.Message); 

public static void Decompress(string errorMsg) 
{ 
    HttpContext.Current.Response.Filter = new DeflateStream(new MemoryStream(ASCIIEncoding.Default.GetBytes(errorMsg)), CompressionMode.Compress); 
} 

答えて

1

:ちょうどこれを行います。この方法で応答ストリームを読み取ることはできません。

応答ストリームがIISの設定で圧縮されている可能性があり、コードでこれを変更できないことがあります。 IISの圧縮設定を更新して、もう一度お試しください。

+0

あなたは私に素晴らしい考えを与えました。これはSUPER SIMPLYでした。私の投稿を編集させてください。 –

関連する問題