簡體   English   中英

空的http響應正文

[英]Empty http response body

我正在嘗試使用C#中的套接字進行HTTP請求/響應。 GET請求出現在下面。

 StringBuilder sb = new StringBuilder();
 sb.AppendFormat("GET http://{0}/ HTTP/1.1\r\n", hostname);
 sb.AppendFormat("Host: {0}\r\n", hostname);
 sb.Append("Connection: keep-alive\r\n");
 sb.Append(@"Accept:text/html,*/*");
 sb.Append("\r\n\r\n");

其中的主機名類似於“ mit.edu”或“ facebook.com”或“ google.com”或其他任何名稱。 由於某些奇怪的原因,我只有一條狀態行(帶有200個狀態代碼)和標頭作為http響應。 但是響應中沒有消息正文: 控制台應用程序的附加srceenshot

這是一種使用套接字執行所有操作並發出http請求的方法:

public static void DoHttpGetRequest(String hostname, Int16 port = 80) {
      IPHostEntry ipHostEntry = Dns.GetHostEntry(hostname);
      IPAddress ipAdress = ipHostEntry.AddressList[0];
      IPEndPoint ipEndPoint = new IPEndPoint(ipAdress, port);

      Socket socket = new Socket(ipAdress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

      socket.Connect(ipEndPoint);

      String request = CreateRequest(hostname);

      Byte[] byteRequest = Encoding.UTF8.GetBytes(request);
      Byte[] byteResponse = new Byte[1000];

      int bytesSent = socket.Send(byteRequest);
      int bytesReceive = socket.Receive(byteResponse);

      Console.WriteLine(request);
      Console.WriteLine();
      Console.WriteLine(Encoding.UTF8.GetString(byteResponse, 0, bytesReceive));

      socket.Shutdown(SocketShutdown.Both);
      socket.Close();
}

我首先想到的是套接字沒有收到服務器的全部響應。 在這種情況下,我仍然不知道如何解決問題。

那么發生了什么? 錯誤在哪里?

不要期望在一次接收中得到完整的響應。 您要做的是接收數據,直到擁有完整的響應標頭為止(這也可能需要幾個接收調用),然后解析標頭以找出響應有多長時間,然后讀取響應的必要數據,這也可能需要多個接聽電話。 而且由於您正在執行HTTP / 1.1請求,所以您還必須處理分塊響應。

我建議更好地使用HTTP庫來處理所有問題。 如果您堅持要自己做所有事情,請閱讀HTTP規范並相應地實現。 它也有助於環顧類似請求的stackoverflow ,因為這個問題對於第一次嘗試實現HTTP的人來說非常典型,而對於套接字,TCP和HTTP的工作原理卻不夠了解。

我認為您應該將插座打開更長的時間。 插入一個

Thread.Wait(5000);

可能會有所幫助。 然后你可以做第二個socket.Steffen建議接收。 也許您可以嘗試以下方法(等待服務器關閉連接):

while (socket.Connected) do
{
    int bytesReceive = socket.Receive(byteResponse);
}

但是我沒有測試。 使用System.Net.Http.HttpClient更容易

我要做的就是通過多個接收呼叫接收數據,直到接收到所有響應信息為止。

do
{                
     bytesReceive = socket.Receive(byteResponse, byteResponse.Length, 0);
     response += Encoding.UTF8.GetString(byteResponse, 0, bytesReceive);
}
while (bytesReceive > 0);

感謝大家的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM