2

HTTP経由でサーバーサイドと通信するデスクトップクライアントがあります。サーバーのデータ処理に問題がある場合、適切な HTTP コード (主に HTTP-400) を含む HTTP 応答本文の JSON でエラーの説明を返します。

HTTP-200 応答を読むと、すべて問題なく、このコードが機能します。

 using (var response = await httpRequest.GetResponseAsync(token))
                {
                    using (var reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")))
                    {
                        return await reader.ReadToEndAsync();
                    }
                }

しかし、エラーが発生し、WebException がスローされてキャッチされると、次のコードが表示されます。

 catch (WebException ex)
            {
                 if (ex.Status == WebExceptionStatus.ProtocolError)
                {                   
                    using (var response = (HttpWebResponse) ex.Response)
                    {
                        using (var stream = response.GetResponseStream())
                        {
                            using (var reader = new StreamReader(stream, Encoding.GetEncoding("utf-8")))
                            {
                                var json = reader.ReadToEnd();
                            }
                        }
                    }
                }
            }

私はすでにそれを機能させるために何かを行っていますが、次のことが起こります: response.ContentLength有効です(184)がstream.Length0で、その後jsonを読み取ることができません(それ""はです)どこを見ればよいかさえわかりません。動作するはずです。

何が問題なのですか?

4

2 に答える 2

0

以前に同様の問題に直面したことを覚えていますが、ストリームの位置の設定に関連するものがありました。これは、以前に私のために働いた webResponse を読み取るための私のソリューションの 1 つです。同様のアプローチがうまくいくかどうか試してください:-

private ResourceResponse readWebResponse(HttpWebRequest webreq)
    {
        HttpWebRequest.DefaultMaximumErrorResponseLength = 1048576;
        HttpWebResponse webresp = null;// = webreq.GetResponse() as HttpWebResponse;
        var memStream = new MemoryStream();
        Stream webStream;
            try
            {
                webresp = (HttpWebResponse)webreq.GetResponse();
                webStream = webresp.GetResponseStream();
                byte[] readBuffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = webStream.Read(readBuffer, 0, readBuffer.Length)) > 0)
                    memStream.Write(readBuffer, 0, bytesRead);
            }
            catch (WebException e)
            {
                var r = e.Response as HttpWebResponse;
                webStream = r.GetResponseStream();
                memStream = Read(webStream);
                var wrongLength = memStream.Length;
            }


            memStream.Position = 0;
            StreamReader sr = new StreamReader(memStream);
            string webStreamContent = sr.ReadToEnd();

            byte[] responseBuffer = Encoding.UTF8.GetBytes(webStreamContent);
//......
//.......

お役に立てれば!

于 2015-02-05T08:09:49.740 に答える