2016-12-08 3 views
0

Я должен добавить 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); 
} 

ответ

1

Я предлагаю проверить ваш запрос uri. Вы получите 404, только если ваш запрос uri ошибочен. Либо ресурс не существует на сервере, либо ваш сервер не работает.

если бы вы дали неверное значение в другом месте в заголовках, как ContentEncoding, означает, что сервер происхождения не поддерживает кодировку, вы получите разные ошибки codes..here в 415 (не поддерживается), но не 404.

+0

Спасибо за ваш ответ. Однако, если мой запрос uri был неправильным, я бы не получил ошибку 404 без этой строки 'request.Headers.Add (HttpRequestHeader.ContentEncoding,« gzip »);' –

0

Неправильное поле заголовка устанавливается на «gzip».

ContentEncoding относится к типам символов в данных, прежде чем будет выполнен любой gzipping и т. Д. Он имеет значения, обозначающие кодировки, такие как «Ascii», «UTF7», «UTF32» и т. Д. См. here и here.

«Gzip» - тип MIME, указанный через HttpRequestHeader.ContentType. См. here.

+0

Собственно, на основе какого-то поиска я выхожу подобную мысль. Однако мой поставщик услуг точно говорит, что «Следующая строка должна быть добавлена ​​в HTTP-заголовок: Content-Encoding: gzip». Тогда я подумал, что должен быть какой-то способ передать это как заголовок. –

+0

Тогда я должен вставить инструкцию gzip в эту строку моего кода: 'request.ContentType =" text/xml ";'? –

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