使用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()完成?这确实是确定请求响应时间的正确方法吗?
解决方法:
如果您只想知道网络上请求和响应之间的延迟,请使用诸如Fiddler之类的网络数据包嗅探器.与使用进程内计时器相比,我对来自数据包级工具的时序图更有信心.通过包括.net堆栈开销,进程中的测量可能会略有偏差.如果您想知道服务器响应的速度,则您不希望包括客户端开销.