2012-08-10 52 views
0

我需要在本地測試一些使用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響應並在第二個響應中拋出異常。

謝謝。

+3

你發送的實際數據的一些轉儲會很好。嘗試提琴手。 – CodeCaster 2012-08-10 08:15:31

+0

你說得對,問題在於數據被髮送。我在單獨的答案中發佈了問題的描述。 – sdds 2012-08-10 11:23:30

回答

0

答案其實很簡單 - 第二個http響應在它的頭文件中設置了「Transfer-Encoding:chunked」,並且在響應結束時我沒有真正發送終止的零長度塊,因此WebClient正在等待更多數據。

相關問題