2012-06-09 4 views
3

C#을 사용하면 WebRequest에서 응답을 받기 시작하는 데 걸리는 시간을 결정해야합니다 (지금은 전체 응답을 다운로드하는 데 걸리는 시간이 걱정 스럽습니다).WebResponse의 첫 번째 비트까지 시간을 얻으려면 어떻게해야합니까?

나는 이것을 이해하기 위해 WebRequest의 비동기 메서드를 사용해야한다. 여기에 내가 가지고 올 한 내용은 다음과 같습니다. "값이 있어야합니다 Null 허용 대상"

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와 같은 네트워크 패킷 스니퍼를 사용하십시오. 나는 패킷 레벨 도구의 타이밍 수치를 인 - 프로세스 타이머보다 더 확신 할 수있다. In-process 측정 값은 .NET 스택 오버 헤드를 포함하여 약간 비뚤어 질 수 있습니다. 서버가 응답하는 속도를 알고 싶다면 클라이언트 오버 헤드를 포함시키지 않으려 고합니다.

+0

감사합니다. 패킷 레벨 모니터링/타이밍을 기존 코드로 계층화하는 것이 가능합니까 (서버 응답 시간을 확인하는 것 이상을 수행함)? 피들러에 API가 있는지 확인하겠습니다. – James

+1

FiddlerCore가 귀하가 찾고있는 것일 수 있습니다. – dthorpe

+0

완벽한! 고맙습니다 :) – James

관련 문제