Как обрабатывать gzip-сообщение, полученное через IRequestChannel.Request - PullRequest
0 голосов
/ 14 октября 2010

Мы получаем сообщение от вызова WCF в виде данных GZip, но код ожидает XML.

Я работаю над КПК, который взаимодействует с веб-службой WCF.Ответом службы является формат SOAP, сжатый с помощью gzip.

Поскольку мы работаем в CF3.5, нам необходимо сгенерировать прокси клиента службы с помощью служебной программы NetCFSvcUtil.exe.

Это часть сгенерированного кода в CFClientBase, в которой возникает ошибка.

Private Function getReply(ByVal msg As System.ServiceModel.Channels.Message) As System.ServiceModel.Channels.Message
    If (Me.RequestChannelFactory Is Nothing) Then
        'transport doesn't support requests
        Throw New System.NotSupportedException
    End If
    Dim requestChannel As System.ServiceModel.Channels.IRequestChannel
    System.Threading.Monitor.Enter(Me.RequestChannelFactory)
    Try 
        requestChannel = Me.RequestChannelFactory.CreateChannel(Me.remoteAddress)
    Finally
        System.Threading.Monitor.Exit(Me.RequestChannelFactory)
    End Try
    requestChannel.Open
    Try 
        Return requestChannel.Request(msg)  
    Finally
        If (requestChannel.State = System.ServiceModel.CommunicationState.Opened) Then
            requestChannel.Close
        End If
    End Try
End Function

В строке requestChannel.Request (msg) ответ отправляется в формате gzipped, но выдает исключение, поскольку ожидает xml.

Это сбрасывается сообщением: «Существует проблема с XML, который был получен из сети. Дополнительные подробности см. Во внутреннем исключении.»
Внутреннее исключение: «», шестнадцатеричное значение 0x1F, является недопустимым символом. Строка 1, позиция 1. "

У меня закончились идеи по этому поводу, любая помощь / совет будет очень кстати.

ОБНОВЛЕНИЕ:
Iперестал пытаться сделать это таким образом - закончилось время.
В конце я изменил свои привязки на basicHTTPBinding, добавил веб-ссылку через Visual Studio, а затем сделал это так, как предложил Гото.Попытка сделать что-то помимо самых простых вещей между WCF и компактной структурой - такая боль.

1 Ответ

1 голос
/ 14 октября 2010

Вы пробовали это решение :

На стороне клиента вы можете подключить DataServiceContext.SendingRequest событие для включения AutoDecompress на запрос

((System.Net.HttpWebRequest) e.request) .AutomaticDecompression = (System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate);

...