我道歉,如果这有点暗淡,但我想通过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是stringbuilder对象!
当我尝试从流中读取时,我根本没有从服务器得到任何响应,所以很明显服务器无法理解我的dumbass请求!
我知道我可以使用webrequest的变体来做同样的事情,但有一个特定的原因,我试图这样做...
基本上我需要知道要发送什么编码才能生成get请求?
答案 0 :(得分:3)
在黑暗中射击:
尝试将请求的标头Connection
设置为“关闭”。
答案 1 :(得分:2)
您似乎缺少的一件事是请求末尾的空白行。 HTTP specification需要一个空行来将标题字段与邮件正文分开,或者表示GET请求的结束。
目前,服务器不知道您的请求已完成,因此它将等待下一行。添加额外的sb.AppendLine()
应该可以解决这个问题。
答案 2 :(得分: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();
}