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のバリエーションを使用して同じことを実行できることは知っていますが、これを実行しようとしている特定の理由があります...

基本的に、getリクエストを実行できるように、送信用に何をエンコードするかを知る必要がありますか?

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 に答える
2

欠けているように見えることの 1 つは、要求の最後の空白行です。HTTP 仕様では、ヘッダー フィールドをメッセージ本文から分離するため、または GET 要求の終了を示すために空白行が必要です。

現状では、サーバーはリクエストが終了したことを認識していないため、次の行を待機しています。エクストラを追加すると、sb.AppendLine()それが修正されます。

于 2012-06-11T10:18:17.700 に答える