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

8

我使用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


这实际上是一个与 VMWare NAT 网络相关的问题。虽然我仍然觉得很奇怪。 - koen
我第一次没有看到长时间的延迟,但每个请求似乎都在增加。 GetRequestStream 花费的时间大约是 GetResponse 的两倍。 - Hot Licks
将代理设置为null似乎并没有什么帮助。 - Hot Licks
5个回答

12

您也可以尝试将.Proxy = null设置为null。有时它会尝试自动检测代理,这需要花费时间。


2
这就是全部了。非常感谢!代理检测花费了20秒钟。 - koen

1
我遇到了同样的问题,但是.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.");
};

唯一有效的解决方案!我尝试了所有方法。非常感谢! - Dimitar

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字段会触发启动开销。


1

听起来像是你的应用程序在第一次访问时进行了预编译。这是 .net 的工作方式。

以下是加速 Web 应用程序的方法。链接文本


它实际上是一个Windows服务。每次我启动服务时都会发生这种情况,而不仅仅是在编译后。 - koen

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接