2012-06-08 107 views
2

我道歉,如果這是一個有點暗淡,但我想給這樣的事情在一個sslstream到服務器,我已經獲得了安全套接字連接到...構建GET請求SslStream

GET /F5Check/qpi/1 HTTP/1.1 
Host: *****.com 
Connection: keep-alive 
Cache-Control: max-age=0 
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

我使用字符串生成器

var sb = new StringBuilder(); 
sb.AppendLine("GET /F5Check/qpi/1 HTTP/1.1"); 
sb.AppendLine(string.Format("Host: {0}", host)); 
sb.AppendLine("Connection: keep-alive"); 
sb.AppendLine("User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5"); 
sb.AppendLine("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
sb.AppendLine("Accept-Encoding: gzip,deflate,sdch"); 
sb.AppendLine("Accept-Language: en-US,en;q=0.8"); 
sb.AppendLine("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"); 

,然後做這個

//Translate the data. 
byte[] sendBuffer = UTF8Encoding.UTF8.GetBytes(sb.ToString()); 

//Send the data. 
requestStream.Write(sendBuffer); 

其中sb是串嘗試建設者對象!

當我試圖從流中讀取數據時,服務器無法理解我的愚蠢請求,我根本沒有收到服務器的任何響應!

我知道我可以使用的WebRequest的變化做同樣的事情,但爲什麼我要做這個特殊的理由......

基本上我需要知道如何發送,這樣我編碼可以產生獲取請求嗎?

+1

HttpWebRequest有什麼問題? (除了你可以使用WebClient或HttpClient) – dtb

+0

實現HTTP並不是小菜一碟。你需要閱讀規範來發送正確的零碎。看看這裏:http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics http:///tools.ietf.org/html/draft-ietf-httpbis-p3-payload – dtb

+0

我知道這不是一塊蛋糕......如果是這樣,我不會在這裏問它;-) –

回答

3

在黑暗中拍攝:

嘗試設置請求的頭Connection 「關閉」。

+0

我會看看 –

+0

Woohooo - 那麼做 –

+0

那麼這是一個運氣猜測。 – Totero

2

你似乎缺少的一件事是請求結束時的空行。 HTTP specification需要一個空行來將標題字段與消息正文分開,或者表示GET請求的結束。

就目前而言,服務器並不知道您的請求已完成,因此它將等待下一行。增加一個額外的sb.AppendLine()應該可以解決這個問題。

+0

謝謝。我會嘗試.. –

2

我需要根據HTTP標準額外換行。簡單地擴展Tim的內容,這裏有一些源代碼。我繼續使用SslStream類進行連接,我假設你也是這樣做的。我對Google的HTTPS網站進行了測試,並得到了回覆。希望這足以讓你回到正軌。

注意:我更改了UA字符串,因爲我們的代理因爲某種原因而討厭那個。我不認爲這是你的問題,但這對我來說是一個問題。

static void Main(string[] args) 
    { 

     string host = "encrypted.google.com"; 

     // Connect socket 
     TcpClient client = new TcpClient(host,443); 
     NetworkStream stream = client.GetStream(); 

     // Wrap in SSL stream 
     SslStream sslStream = new SslStream(stream); 
     sslStream.AuthenticateAsClient(host); 

     //Build request 
     var sb = new StringBuilder(); 

     sb.AppendLine("GET/HTTP/1.1"); 
     sb.AppendLine(string.Format("Host: {0}", host)); 
     sb.AppendLine("Connection: keep-alive"); 
     sb.AppendLine("User-Agent: CSharp"); 
     sb.AppendLine("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
     sb.AppendLine("Accept-Encoding: gzip,deflate,sdch"); 
     sb.AppendLine("Accept-Language: en-US,en;q=0.8"); 
     sb.AppendLine("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"); 
     sb.AppendLine(); 

     //Go go go! 
     byte[] headerBytes = Encoding.UTF8.GetBytes(sb.ToString()); 
     sslStream.Write(headerBytes, 0, headerBytes.Length); 
     sslStream.Flush(); 


     //Get a place to put it 
     byte[] buffer = new byte[2048]; 
     int bytes; 

     //Answer 
     do 
     { 
      bytes = sslStream.Read(buffer, 0, buffer.Length); 
      Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes)); 
     } while (bytes != 0); 

     //And done 
     client.Close(); 
     Console.ReadKey(); 


    } 
+0

謝謝,但沒有運氣 –