Как я могу распаковать Ответ на ошибку приложения? - PullRequest
0 голосов
/ 09 ноября 2011

У меня возникла проблема, когда при возникновении ошибки сервера в моем веб-приложении на экране отображается ошибка сервера gzip, а не фактическое сообщение об ошибке.Я пытаюсь решить эту проблему, вызывая GZIP Decompress на 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 требует нестатического запроса.

Открыто для всего.Спасибо.

Сумасшедший.Просто сделайте это:

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 Ответ

1 голос
/ 09 ноября 2011

Я бы предложил вам сделать Response.Clear, а затем установить соответствующие заголовки, а затем отправить данные.Это правильно, что вы не можете прочитать поток ответов таким образом.

Возможно, ваш поток ответов сжат настройками в IIS и вы не можете изменить это с помощью кода.Обновите параметры сжатия IIS и повторите попытку.

...