2

私は現在、php / MySQLオンラインシステムに接続するためのC#アプリケーションを作成しています。アプリケーションは、投稿データをスクリプトに送信し、応答を取得する必要があります。

以下のデータを送信すると

username = test&password = test  

次の応答があります...

2010年4月22日12:15:42にリクエストを開始  
リクエストの作成が完了しました:00:00:00.0570057かかりました  
2010年4月22日12:15:42にデータを送信  
データを送信しました:00:00:06.9316931を取りました<<-
2010年4月22日12:15:49に応答を取得  
応答の取得00:00:00.0360036  
終了した応答00:00:00.0360036  
通話全体に00:00:07.0247024かかりました  

実際にスクリプトにデータを送信するのに6秒かかることがわかるように、telnetからデータを送信し、ローカルファイルからURLに投稿データを送信することでさらにテストを行いました。1秒もかからないので、これはサイトでホストされているスクリプトに問題はありません。

2つの単純な文字列であるのに、なぜデータの送信に6秒かかるのですか?

カスタムクラスを使用してデータを送信します

class httppostdata
{
    WebRequest request;
    WebResponse response;

    public string senddata(string url, string postdata)
    {
        var start = DateTime.Now;
        Console.WriteLine("Starting request at " + start.ToString());

        // create the request to the url passed in the paramaters
        request = (WebRequest)WebRequest.Create(url);


        // set the method to post
        request.Method = "POST";
        // set the content type and the content length
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = postdata.Length;
        // convert the post data into a byte array
        byte[] byteData = Encoding.UTF8.GetBytes(postdata);
        var end1 = DateTime.Now;
        Console.WriteLine("Finished creating request : took " + (end1 - start));

        var start2 = DateTime.Now;
        Console.WriteLine("Transmitting data at " + start2.ToString());
        // get the request stream and write the data to it
        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteData, 0, byteData.Length);
        dataStream.Close();
        var end2 = DateTime.Now;
        Console.WriteLine("Transmitted the data : took " + (end2 - start2));


        // get the response
        var start3 = DateTime.Now;
        Console.WriteLine("Getting the response at " + start3.ToString());


        response = request.GetResponse();
        //Console.WriteLine(((WebResponse)response).StatusDescription);
        dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        var end3 = DateTime.Now;
        Console.WriteLine("Getting response " + (end3 - start3));

        // read the response
        string serverresponse = reader.ReadToEnd();
        var end3a = DateTime.Now;
        Console.WriteLine("Finished response " + (end3a - start3));

        Console.WriteLine("Entire call took " + (end3a - start));

        //Console.WriteLine(serverresponse);
        reader.Close();
        dataStream.Close();
        response.Close();

        return serverresponse;
    }
}

そしてそれを私が使う

private void btnLogin_Click(object sender, EventArgs e)
{
    // string postdata;

    if (txtUsername.Text.Length < 3 || txtPassword.Text.Length < 3)
    {
        MessageBox.Show("Missing your username or password.");
    }
    else
    {
        string postdata = "username=" + txtUsername.Text +
                          "&password=" + txtPassword.Text;

        httppostdata myPost = new httppostdata();
        string response = myPost.senddata("http://www.domainname.com/scriptname.php", postdata);
        MessageBox.Show(response);
    }
}
4

2 に答える 2

4

WebRequest のプロキシ プロパティを明示的に null に設定していることを確認してください。そうしないと、プロキシ設定の自動検出が試行されますが、これには時間がかかる場合があります。

于 2010-04-22T11:51:01.830 に答える
0

テストでは、これを 1 回しか呼び出していないため、C# コードが JIT コンパイルされているために遅延が発生している可能性があります。

より良いテストは、これを 2 回呼び出し、最初のタイミングを破棄して、より良いかどうかを確認することです。

さらに良いテストは、最初の一連のタイミングを破棄し、これを何度も実行して平均を取ることですが、非常に大まかな「指標」ビューの場合、これはおそらく必要ありません。

余談ですが、この種のタイミングでは、よりもSystem.Diagnostics.Stopwatchクラスを使用した方がよいでしょうSystem.DateTime

[編集] また、プロキシに関する Mant101 の提案に注意してください。プロキシを設定しないと問題が解決しない場合は、Fiddlerをセットアップし、Fiddler をプロキシとして使用するように要求を設定することをお勧めします。これにより、実際の http 呼び出しをインターセプトできるため、フレームワークの外部から http 呼び出しのタイミング自体をより正確に把握できます。

于 2010-04-22T11:35:52.147 に答える