3

使用 C#,我需要确定开始接收来自 WebRequest 的响应所需的时间(目前,我并不担心下载完整响应所需的时间)。

据我了解,要做到这一点,我需要使用 WebRequest 的异步方法。这是我想出的:

public TimeSpan TimeToFirstBit(string url)
{
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  request.Accept = "*/*";

  DateTime? firstBit = null;
  DateTime start = DateTime.Now;

  IAsyncResult asyncResult = request.BeginGetResponse(
      (async) => { firstBit = DateTime.Now; },
      null);

  asyncResult.AsyncWaitHandle.WaitOne();
  request.EndGetResponse(asyncResult);

  TimeSpan result = start - firstBit.Value; 
  // Previous line generates a System.InvalidOperationException: 
  // "Nullable object must have a value."

  return result;

}

这导致“可空对象必须有一个值”。这似乎表明 WaitOne() 和 EndGetResponse 方法实际上并没有像我认为的那样等待异步调用完成。

那么我该如何等到 BeginGetResponse() 完成呢?这确实是确定请求响应时间的正确方法吗?

4

1 回答 1

4

如果您只想知道网络上请求和响应之间的延迟,请使用网络数据包嗅探器,例如 Fiddler。我对来自数据包级工具的计时数据比来自进程内计时器更有信心。由于包含 .net 堆栈开销,进程内测量可能会略有偏差。如果您想知道服务器的响应速度有多快,您就不想包括客户端开销。

于 2012-06-10T06:33:58.570 回答