1

だから私は次のような関数を持っています:

private String SendRequest(String jsonRequest)
    {
        WebRequest webRequest = WebRequest.Create(_url);
        byte[] paramBytes = Encoding.UTF8.GetBytes(jsonRequest);
        byte[] responseBytes;

        webRequest.Method = "POST";
        webRequest.ContentType = "application/json";
        webRequest.ContentLength = paramBytes.Length;
        webRequest.Headers.Add("X-Transmission-Session-Id", _sessionId);


        using (Stream oStream = webRequest.GetRequestStream())
        {
            oStream.Write(paramBytes, 0, paramBytes.Length);
        }

        WebResponse webResponse = webRequest.GetResponse();

        using (Stream iStream = webResponse.GetResponseStream())
        {
            responseBytes = new byte[webResponse.ContentLength];
            iStream.Read(responseBytes, 0, (int) webResponse.ContentLength);
        }

        return Encoding.UTF8.GetString(responseBytes);
    }

問題は、iStream.Read() の段階で一部のバイトが失われることです。Wireshark を使用すると、すべてのバイトがこのマシンに送信されていることがわかりますが、.Net は途中でそれらを失っています。たとえば、現在のデバッグ セッションでは、webResponse.ContentLength = 4746 byte[3949] から byte[4745] はすべて 0 ですが、データを入力する必要があります。その結果、UTF8 JSON 文字列が早期に途切れてしまい、JSON をデシリアライズできません。

コードはかなり明確だと思いましたが、これらのバイトを失うのがどこで間違っているのかわかりません。

助けてくれてありがとう!

4

2 に答える 2

1

ストリームから読み取ると、要求されたよりも少ないバイトを取得できます。

http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

バッファーに読み取られた合計バイト数。これは、要求されたバイト数が現在使用できない場合は要求されたバイト数よりも少なくなる可能性があり、ストリームの終わりに達した場合はゼロ (0) になる可能性があります。

msdn の例WebResponse.GetResponseStream(): http://msdn.microsoft.com/en-us/library/system.net.webresponse.getresponsestream.aspx

于 2013-07-08T14:20:36.177 に答える