Сжатие HttpWebRequest с помощью gzip
Я разрабатываю.NET 4.0
Консольное приложение в качествеSOAP Web Service
клиент, который будет отправлять данные (POST) сторонним лицам. У меня нет контроля над веб-сервисом на стороне сервера. Третья сторона предоставилаWSDL's
использовать, и я смог импортировать их и использовать их с разумным успехом. Однако существует требование сжать сообщение запроса, используяgzip
и я не мог на всю жизнь понять, как это сделать, используя прокси-сервисы.
Эта тема здесь, в SO, я поверил, что, не имея контроля над клиентским и серверным кодом, запрос не может быть сжат. В результате этого я написал код в своем приложении, чтобы вручную создатьSOAP XML
вXDocument
объект; затем заполнил значения изWSDL
объекты прокси-класса, которые я ранее использовал в своем клиентском приложении.
Первым требованием для этого клиента является отправка сообщения, сжатого черезgzip
, После некоторого исследования я увидел ответы так же просто, как простоHttpRequestHeader.AcceptEncoding, "gzip, deflate"
в заголовок запроса. К сожалению, это не сработало.
В настоящее время сертификат, который я получаю, не является настоящим сертификатом. Я пытаюсь сделать код как можно более надежным, прежде чем развертывать его в тестовой среде для проведения реального тестирования сервиса.
Есть ли способ сжать запрос через вызов прокси (wsdl
)?Есть что-то, чего мне не хватает, чтобы правильно сжатьHttpWebRequest
?Может ли быть что-то еще не так, что приведет к возвращению сообщения об ошибке?Я ожидаю, что другое сообщение, касающееся аутентификации, будет недействительным, если сам запрос будет в порядке.Есть ли способ сжатия может быть сделано через
app.config
?Следующий набор требований Я немного запутался в том, как справляться / что делать. При условии, что я установилContentType
запроса, как (и что) добавить, чтобы добавитьcontent-transfer-encoding
кусок к запросу? ЕслиContentType
неверно, как мне добавить эту информацию?
Тип содержимого для SOAP Evenlope с вложением в кодировке MTOM должен быть «application / xop + xml», а кодирование передачи содержимого должно быть 8-разрядным.
Я прошел несколько итераций приведенного ниже кода, однако я считаю, что соответствующие фрагменты кода - это код в его простейшей форме. Пожалуйста, дайте мне знать, если есть другая информация, которая будет полезна.
Метод для создания HttpWebRequest:
private static HttpWebRequest CreateWebRequest(SoapAction action)
{
string url = GetUrlAddress(action);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
request.Headers.Add("SOAPAction", action.ToString());
request.ContentType = "application/xop+xml";
request.Accept = "text/xml";
request.Method = "POST";
request.ClientCertificates.Add(/* Retrieve X509Certificate Object*/);
return request;
}
Код для отправки запроса:
using (Stream stream = request.GetRequestStream())
{
soapXml.Save(stream);
}
Код для получения ответа:
Вот как я получаю сообщение об ошибке, которая происходит
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader reader = new StreamReader(response, Encoding.Default))
{
File.AppendAllText(filePath, response.Headers.ToString());
File.AppendAllText(filePath, reader.ReadToEnd());
}
}
}
catch (WebException ex)
{
using (var stream = ex.Response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
Console.WriteLine(reader.ReadToEnd());
}
}
}
Получено сообщение об ошибке:
Сообщение запроса должно быть отправлено с использованием сжатия HTTP (RFC 1952 - GZIP).