ウェブアプリケーションでサーバエラーが発生した場合、実際のエラーメッセージではなく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);
}
あなたは私に素晴らしい考えを与えました。これはSUPER SIMPLYでした。私の投稿を編集させてください。 –