[英]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.