2

我目前正在创建一个 C# 应用程序以绑定到 php / MySQL 在线系统。应用程序需要将发布数据发送到脚本并获得响应。

当我发送以下数据时

用户名=测试&密码=测试  

我收到以下回复...

在 22/04/2010 12:15:42 开始请求  
完成创建请求:花费 00:00:00.0570057  
在 22/04/2010 12:15:42 传输数据  
传输数据:取 00:00:06.9316931 <<--
在 22/04/2010 12:15:49 获得回复  
获得响应 00:00:00.0360036  
完成响应 00:00:00.0360036  
整个通话时间为 00:00:07.0247024  

如您所见,实际将数据发送到脚本需要 6 秒,我已经完成了进一步的测试,再见从 telnet 发送数据,并通过将本地文件中的 post 数据发送到 url,他们甚至不需要一秒钟,所以这是网站上托管的脚本没有问题。

当它是两个简单的字符串时,为什么传输数据需要 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

很有可能是因为,在您的测试中,您只调用了一次,您看到的延迟是正在 JIT 编译的 C# 代码。

更好的测试是调用两次,并丢弃第一次的时间,看看它们是否更好。

更好的测试是丢弃第一组时序,然后运行多次并取平均值,尽管对于非常松散的“指示性”视图,这可能没有必要。

顺便说一句,对于这种时间,最好使用System.Diagnostics.Stopwatchover 类System.DateTime

[编辑] 另外,请注意 Mant101 关于代理的建议,如果设置无代理无法解决问题,您可能希望设置Fiddler并将您的请求设置为使用 Fiddler 作为其代理。这将允许您拦截实际的 http 调用,以便您可以从框架外部更好地分解 http 调用时间本身。

于 2010-04-22T11:35:52.147 回答