2012-06-09 23 views
3

使用C#,我需要確定從WebRequest接收響應所需的時間(現在,我不擔心下載完整響應所需的時間)。如何獲得WebResponse的第一個位的時間?

從我可以理解,要做到這一點,我需要使用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()完成?這確實是確定請求響應時間的正確方法嗎?

+0

你不能使用WebClient類嗎?它有你可能處理的DownloadProgressChanged事件。 –

+1

您使用異步功能是沒有意義的。您正在等待異步結果嗎?那不是異步的。 – usr

+0

@Adriano - 我會研究一下,謝謝。 usr - 我對異步執行操作不感興趣,它看起來像獲取我需要的信息的必要手段。 – James

回答

4

如果您只是想知道線路上的請求和響應之間的延遲,請使用網絡數據包嗅探器(如Fiddler)。我對數據包級工具的時序數據比對進程內定時器的數據更有信心。通過包含.net堆棧開銷,可以使進程內測量值稍微偏移。如果您想知道服務器的響應速度,您不希望包含客戶端開銷。

+0

謝謝!是否有可能將分組級別的監控/定時分層到我現有的代碼中(這不僅僅是檢查服務器響應時間)?我將檢查Fiddler是否有API。 – James

+1

FiddlerCore可能是你要找的。 – dthorpe

+0

完美!謝謝 :) – James

相關問題