3

如果这有点暗,我深表歉意,但我想通过 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 对象!

当我尝试从流中读取数据时,我根本没有得到服务器的任何响应,所以很明显服务器无法理解我的愚蠢请求!

我知道我可以使用 webrequest 的变体来做同样的事情,但我尝试这样做是有特定原因的......

基本上我需要知道要对发送进行什么编码,以便我可以执行获取请求?

4

3 回答 3

3

我支持根据 HTTP 标准需要额外的换行符。简单地扩展蒂姆所拥有的,这里有一些源代码。我继续使用 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();


    }
于 2012-06-13T14:02:10.963 回答
3

盲目猜测:

尝试将请求的标头设置Connection为“关闭”。

于 2012-06-15T12:18:54.407 回答
2

您似乎缺少的一件事是请求末尾的空白行。HTTP 规范需要一个空行来将标头字段与消息正文分开,或者表示 GET 请求的结束。

就目前而言,服务器不知道您的请求已完成,因此它将等待下一行。添加一个额外的sb.AppendLine()应该可以解决这个问题。

于 2012-06-11T10:18:17.700 回答