2015-02-02 3 views
1

У нас есть служба WCF REST, размещенная на IIS 7 с .NET Framework 4.5. Клиент отправляет данные в GZip сжатом формате с заголовков запроса:Как обрабатывать сжатый запрос в службе WCF

Content-Encoding: GZIP Content-Type: применение/XML

Но мы получаем плохой запрос от сервера, если запрос находится в сжатом формат. Мы включили сжатие запроса путем реализации IHttpModule, который будет фильтровать/изменять входящие запросы. По моему мнению, это происходит неудачно, потому что WCF использует исходную длину контента (сжатых данных) вместо декомпрессированных данных. Итак, вот мои вопросы:

Есть ли способ исправить проблемы с длиной содержимого в IIS7/.NET 4.5? Моя реализация модуля HTTP приведен ниже:

httpApplication.Request.Filter = Новый GZipStream (httpApplication.Request.Filter, CompressionMode.Decompress) `

Если фиксируя вопрос длины содержимого не возможно на стороне сервера, является есть ли способ отправить исходную длину контента от клиента с помощью сжатого запроса? Реализация на стороне клиента выглядит следующим образом:

using (Stream requeststream = serviceRequest.GetRequestStream()) 
{ 
    if (useCompression) 
    { 
     using (GZipStream zipStream = new GZipStream(requeststream, CompressionMode.Compress)) 
     { 
      zipStream.Write(bytes, 0, bytes.Length); 
      zipStream.Close(); 
      requeststream.Close(); 
     } 

     serviceRequest.Headers.Add("Content-Encoding", "gzip"); 
    } 
    else 
    { 
     requeststream.Write(bytes, 0, bytes.Length); 
     requeststream.Close(); 
    } 
} 
+0

Я сталкиваюсь с тем же. Вы можете добавить фильтр к запросу с помощью модуля, но как только он переходит к WCF, он все равно получает исключение, поскольку теперь запрос имеет другую длину содержимого. – MichaelChan

ответ

-1

Я был в состоянии получить GZIP работает в WCF с помощью WsHttpBinding и это в качестве основы веб-запроса:

private HttpWebRequest GetWebRequest() 
{ 
    dynamic objHTTPReq = (HttpWebRequest)WebRequest.CreateDefault(_URI); 
    objHTTPReq.ContentType = "text/xml; charset=\"utf-8\""; 
    objHTTPReq.Method = "POST"; 
    objHTTPReq.Accept = "gzip, deflate"; 
    objHTTPReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; OfficeLiveConnector.1.3;OfficeLivePatch.0.0; Zune 3.0; MS-RTC LM 8)"; 
    objHTTPReq.Headers.Add("SOAPAction", "http://xxx.yyyy.zzzz"); 
    return objHTTPReq; 
} 

Так дайте что попробовать. Удачи.

+0

Я тоже это пробовал, но входящий запрос все еще сжимается, поэтому, если я не добавлю фильтр, я получаю сжатый поток. Есть ли параметр для указания WCF для распознавания сжатых запросов? – MichaelChan

Смежные вопросы