1

http サーバーとの通信に WebClient オブジェクトを使用するコードをローカルでテストする必要があります。そのために、バイナリ ファイルから数バイトを読み取ってクライアントに送信する、非常に単純なモック サーバーを作成することにしました。関連するサーバーのコードは次のとおりです。

public void Listen()
{
    TcpClient client;
    NetworkStream netStream;
    listener.Start();

    try
    {
        client = listener.AcceptTcpClient();
        netStream = client.GetStream();
        ReadData(netStream);
        Console.WriteLine("Writing data, sequence 1");
        WriteData(netStream, 1);
        netStream.Close();
        client.Close();

        client = listener.AcceptTcpClient();
        netStream = client.GetStream();
        ReadData(netStream);
        Console.WriteLine("Writing data, sequence 2");
        WriteData(netStream, 2);
        netStream.Close();
        client.Close();
    }
    catch(Exception e)
    {
    }
}

private void WriteData(NetworkStream netStream, int sequence)
{
    byte[] bytes = PrepareResponse(sequence);    //get data from a file
    netStream.Write(bytes, 0, bytes.Length);
}

WebClient では UploadString を使用します。

string response = client.UploadString(address + link, data);

つまり、WebClient は明らかに送信されたすべてのデータを受信しますが、ストリーム サーバー側を閉じると System.IO.Exception (「トランスポート接続からデータを読み取れません: 接続が閉じられました。」) がスローされます。ストリームを閉じないと、すべてのデータが受信されているにもかかわらず、WebClient はブロックされ、転送が完了するのを待ちます。WebClient を WebRequest に置き換えようとしましたが、ソケットがサーバー側で閉じられている場合は例外がスローされるか、すべてのデータを読み取った後に stream.Read でブロックされます。私が奇妙に思うのは、WebClient に送信するデータの最初のブロックが http 302 "Moved" 応答であり、WebClient がすぐに GET 要求を送信することです。同じようにデータを 2 回送信したにもかかわらず、WebClient は 2 回目の応答でのみ例外をスローします。

したがって、データを正しく送信して接続を閉じて WebClient で動作するようにする方法が必要です。また、WebClient が 302 応答を正しく処理し、2 番目の応答で例外をスローする理由も知りたいです。

ありがとうございました。

4

2 に答える 2

2

「使用」命令を使用して明確にする必要があります: http://msdn.microsoft.com/fr-fr/library/yh598w02

基本的に、NetworkReader、MemeryStream などのクラスは IDisposable インターフェイスを実装します。これらを using でラップすると、オブジェクトが自動的に破棄されます。

EDIT: また、 http: //msdn.microsoft.com/fr-fr/library/system.net.sockets.networkstream_methods%28v=vs.80%29を参照して、ストリームを読み書きするためのいくつかの方法を使用する必要がありますあなたの代わりにこれ。

于 2012-08-10T08:30:06.263 に答える
0

答えは実際には非常に簡単でした。2番目のhttp応答のヘッダーに「Transfer-Encoding:chunked」が設定されていて、応答の最後に終了する長さゼロのチャンクを実際に送信しなかったため、WebClientはさらに待機していました。データ。

于 2012-08-10T11:18:35.383 に答える