C#第一次使用GetRequestStream()需要20秒

时间:2010-07-28 15:25:42

标签: c#

我使用C#。

我第一次在代码中使用WebRequest GetRequestStream()时,最多需要20秒。之后需要不到1秒钟。

以下是我的代码。行“this.requestStream = httpRequest.GetRequestStream()”导致延迟。

StringBuilder postData = new StringBuilder(100);
postData.Append("param=");
postData.Append("test");
byte[] dataArray = Encoding.UTF8.GetBytes(postData.ToString());

this.httpRequest = (HttpWebRequest)WebRequest.Create("http://myurl.com");

httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";

httpRequest.ContentLength = dataArray.Length;

this.requestStream = httpRequest.GetRequestStream();

using (requestStream)
    requestStream.Write(dataArray, 0, dataArray.Length);

this.webResponse = (HttpWebResponse)httpRequest.GetResponse();

Stream responseStream = webResponse.GetResponseStream();
StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
String responseString = responseReader.ReadToEnd();

我怎样才能看到导致这种情况的原因? (例如:DNS查找?服务器没有响应?)

感谢和问候,Koen

5 个答案:

答案 0 :(得分:11)

您也可以尝试设置.Proxy = null。有时它会尝试自动检测占用时间的代理。

答案 1 :(得分:1)

听起来你的应用程序是在你第一次点击它时进行预编译。这就是.net的工作原理。

这是一种加速您的网络应用的方法。 link text

答案 2 :(得分:1)

它实际上是HTML操作的框架,用于启动网络代理检查以设置属性HttpWebRequest.DefaultWebProxy

在我的应用程序中,作为启动操作的一部分,我创建了一个完整形成的请求作为后台任务,以避免这种开销。

HttpWebRequest web = (HttpWebRequest)WebRequest.Create(m_ServletURL);
web.UserAgent = "Mozilla/4.0 (Windows 7 6.1) Java/1.6.0_26";

在我的情况下设置UserAgent字段会触发启动开销。

答案 3 :(得分:0)

问题可能是.NET, by default, only allows 2 connections at a time

您可以使用以下方法增加同时连接数:

 ServicePointManager.DefaultConnectionLimit = newConnectionLimit;

我们将确定最佳值留给用户。

答案 4 :(得分:0)

我遇到了同样的问题,但是.proxy = null并没有为我解决。根据网络结构,问题可能会连接到IPv6。每次运行应用程序时,第一个请求几乎花了21秒。因此,我认为这必须是超时值。如果达到此值,则将使用后备解决方案IPv4(也用于后续调用)。首先,强制使用IPv4为我解决了这个问题!

HttpWebRequest request = WebRequest.Create("http://myurl.com") as HttpWebRequest;
request.ServicePoint.BindIPEndPointDelegate = (servicePount, remoteEndPoint, retryCount) =>
{
    if (remoteEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
    {
        return new IPEndPoint(IPAddress.Any, 0);
    }
    throw new System.InvalidOperationException("No IPv4 address found.");
};