Сжатие ответа прерываний исключения - PullRequest
2 голосов
/ 19 марта 2010

Я написал IHttpModule, который сжимает мой ответ, используя gzip (я возвращаю много данных.), Чтобы уменьшить размер ответа. Он отлично работает, пока веб-сервис не создает исключение. Если выдается исключение, оно распаковывается, но заголовок Content-encoding исчезает, и клиент не знает, как прочитать исключение.

Почему отсутствует заголовок? Мне нужно получить исключение в клиенте.

Вот модуль:

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;
        }
    }
}

Вот веб-сервис:

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

1 Ответ

0 голосов
/ 19 марта 2010

Вам следует попытаться обработать исключение в page_error или в application_error обработчиках событий. Я не знаю, что происходит с заголовком, но вы, вероятно, можете смоделировать и отладить метод Compress, разделив его на ноль внутри вашего приложения.

Проверьте ссылку о глобальной обработке исключений в ASP.NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...