Я должен добавить Content-Encoding и Accept-Encoding в качестве заголовков (с сжатием gzip) в объект HttpWebRequest
. Установка Accept-Encoding выполняется добавлением этой строки: request.AutomaticDecompression = DecompressionMethods.GZip;
и все в порядке. Однако после установки Content-Encoding (который я не уверен, что все сделано правильно) с этой строкой request.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip");
, я получаю ошибку 404. Вот мой код запроса:Ошибка 404 после добавления Content-Encoding в качестве заголовка запроса
XmlDocument RequestAndResponseHelper(string requestStr, string directory)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(directory);
var data = Encoding.ASCII.GetBytes(requestStr);
request.Method = "POST";
request.ContentLength = data.Length;
request.ContentType = "text/xml";
request.Headers.Add("userName", UserName);
request.Headers.Add("password", Password);
request.AutomaticDecompression = DecompressionMethods.GZip; //this adds 'Accept-Encoding: gzip' as request header
request.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip"); //this adds 'Content-Encoding: gzip' as request header
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
XmlDocument rs = new XmlDocument();
rs.LoadXml(responseString);
return rs;
}
Если вы можете помочь мне справиться с этой ошибкой, я бы очень признателен.
Кроме того, вот мой код сжатия, возможно, есть что-то с сжатием.
String Compress(String requestStr)
{
byte[] buffer = Encoding.UTF8.GetBytes(requestStr);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
{ zip.Write(buffer, 0, buffer.Length); }
ms.Position = 0;
MemoryStream outStream = new MemoryStream();
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);
byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);
}
Спасибо за ваш ответ. Однако, если мой запрос uri был неправильным, я бы не получил ошибку 404 без этой строки 'request.Headers.Add (HttpRequestHeader.ContentEncoding,« gzip »);' –