2016-12-08 11 views
0

HttpWebRequestオブジェクトにヘッダ(gzip圧縮)としてContent-EncodingとAccept-Encodingを追加する必要があります。 Accept-Encodingを設定するには、次の行を追加してください:request.AutomaticDecompression = DecompressionMethods.GZip;これは問題ありません。しかし、この行request.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip");でContent-Encoding(これが正しく実行されているかどうかわからない)を設定した後、404エラーが発生します。ここに私のリクエストコードがあります:要求ヘッダとしてContent-Encodingを追加した後に404エラーが発生しました

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が得られます。リソースがサーバー上に存在しないか、サーバーが停止しています。

あなたはContentEncodingようなヘッダ内の他の場所で誤った値を与えていた場合は、オリジンサーバがエンコーディングをサポートしていないことを意味し、あなたは別のエラーが(サポートされていない)415 codes..hereではなく、404

+0

あなたの答えをありがとう。しかし、私のリクエストuriが間違っていたとすれば、 'request.Headers.Add(HttpRequestHeader.ContentEncoding、" gzip ");' –

0

取得します間違ったヘッダーフィールドが "gzip"に設定されています。

ContentEncodingは、gzippingなどが行われる前のデータの文字タイプに関係します。 「Ascii」、「UTF7」、「UTF32」などのエンコーディングを示す値を持ちます。hereおよびhereを参照してください。

「Gzip」は、HttpRequestHeader.ContentTypeで指定されたMIMEタイプです。 hereを参照してください。

+0

という文字列がないと404エラーが出ないでしょう。しかし、私のサービスプロバイダは、「HTTPヘッダーに次の行を追加する必要があります。 Content-Encoding:gzip」と正確に言います。それから、ヘッダーとしてこれを渡す方法があるはずだと思った。 –

+0

次に、私のコードのこの行にgzip文を埋め込むべきです: 'request.ContentType =" text/xml ";'? –

関連する問題