Вызовы асинхронной веб-службы IIS7 с динамическим сжатием не работают - PullRequest
0 голосов
/ 17 декабря 2009

У нас есть несколько веб-служб ASP.NET, которые не работают в этом идеальном шторме:

  1. IIS7
  2. Динамическое сжатие включено
  3. Вызов веб-службы асинхронный

Если это IIS 6, или мы отключаем динамическое сжатие или синхронно вызываем веб-сервис, он работает нормально.

Сбой при вызове SoapHttpClientProtocol.EndInvoke (IAsyncResult asyncResult) с ошибкой «Неожиданный конец файла».

Используя Fiddler, я вижу, что ответ от IIS 6 имеет кодировку передачи 'chunked' и никакой длины содержимого. Ответ от IIS 7 НЕ разделен на части и имеет длину содержимого. Ошибка конца файла происходит на 1 символ за длину содержимого.

Если я перехватываю сообщение в Fiddler и меняю его на chunked, ошибки не возникает. Ответ мог бы состоять в том, чтобы изменить его на IIS 7 на куски (что я пытался сделать и потерпел неудачу), но я не чувствую, что должен делать это: я думаю, что это должно просто работать!

1 Ответ

0 голосов
/ 11 февраля 2010

Мне пришлось открыть для этого заявку в службу поддержки MSDN, но я получил ответ.

Ответ здесь - простое клиентское решение. Мой предыдущий метод WebRequest выглядел так:

protected override WebRequest GetWebRequest(Uri uri)
{
    var request = base.GetWebRequest(uri);
    request.Headers.Add("Accept-Encoding", "gzip");
    return request;
}

Лучший способ это:

protected override WebRequest GetWebRequest(Uri uri)
{
    var request = (HttpWebRequest) base.GetWebRequest(uri);
    request.AutomaticDecompression = DecompressionMethods.GZip;
    return request;
}

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

Похоже, что это работает как с IIS6, так и с IIS7, хотя ответ IIS6 разделен на части, а ответ IIS7 - нет. Если кто-то может помочь объяснить, почему это работает, это может быть полезно для сообщества.

...