我需要在本地测试一些使用 WebClient 对象与 http 服务器通信的代码。为此,我决定编写一个非常简单的模拟服务器,它从二进制文件中读取一些字节并将它们发送到客户端。这是相关服务器的代码:
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 会阻塞并等待传输完成,尽管已收到所有数据。我试图用 WebRequest 替换 WebClient,如果套接字在服务器端关闭或在流上阻塞,它也会引发异常。读取所有数据后读取。我觉得奇怪的是,我发送给 WebClient 的第一个数据块是一个 http 302“已移动”响应,这会导致 WebClient 立即发送一个 GET 请求。尽管我两次发送相同的数据,但 WebClient 仅在第二次响应时引发异常。
所以 - 我需要一种方法来正确发送数据并关闭连接,以便它与 WebClient 一起工作,我还想知道为什么 WebClient 正确处理 302 响应并在第二个响应时抛出异常。
谢谢你。