我需要在本地測試一些使用WebClient對象與HTTP服務器進行通信的代碼。爲此,我決定寫一個令人難以置信的簡單模擬服務器,它從二進制文件中讀取一些字節並將它們發送給客戶端。下面是相關服務器的代碼:C#:將數據發送到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);
}
隨着Web客戶端我用UploadString:
string response = client.UploadString(address + link, data);
那麼,事情是,WebClient的顯然是接收所有發送的數據,而是拋出一個System.IO.Exception (「無法從傳輸連接讀取數據:連接已關閉。」)當我關閉流服務器端時。如果我不關閉流,WebClient會阻止並等待傳輸完成,儘管所有數據都已收到。我嘗試用WebRequest替換WebClient,如果套接字關閉了服務器端或數據流阻塞,它也會引發異常。讀取所有數據後讀取。我感到奇怪的是,我發送給WebClient的第一個數據塊是一個http 302「Moved」響應,它使WebClient立即發送一個GET請求。儘管我發送了兩次相同的數據,WebClient僅在第二個響應中拋出異常。因此 - 我需要一種方法來正確發送數據並關閉連接,以便它可以與WebClient一起使用,並且我還想知道爲什麼WebClient正確處理302響應並在第二個響應中拋出異常。
謝謝。
你發送的實際數據的一些轉儲會很好。嘗試提琴手。 – CodeCaster 2012-08-10 08:15:31
你說得對,問題在於數據被髮送。我在單獨的答案中發佈了問題的描述。 – sdds 2012-08-10 11:23:30