2009-08-13 3 views
1

상황 : msdn에 설명 된대로 HttpWebRequest.BeginGetResponse를 사용하고있었습니다. 10 초마다 요청을 보내는 타이머가 있습니다. 테스트 할 때 XML 구조화 된 정보를 받았습니다.타이머가있는 비동기 HttpWebRequest 문제

결과 : 고객 위치에 있고 해당 도구를 실행하는 데 불완전한 (따라서 해석 할 수없는) xml (각 약 4KB)이 수신되었습니다. 브라우저에서 확인하고 완전히 볼 수 있습니다 (브라우저를 통한 동기식 요청이 분명합니다!). 내 수신 버퍼 크기를 콘텐츠 길이에 대한 헤더 정보를 사용했습니다.

원인은 무엇입니까? 나는 모른다. 데이터가 상당히 적습니다. 여전히 developer fusion에 설명 된 ThreadPool.RegisterWaitForSingleObject 접근 방식을 사용하여 제한 시간을 정의했으며, 제한 시간도 10 초로 선택했습니다. 어쩌면 그것은 현명한 결정이 아니었을 것입니다. 아마 타이머 간격보다 작아야합니다. 문제는 그 조건에서 다시 테스트 할 수 없다는 것입니다. 그것은 생산 현장에 있었고 네트워크 설치에 대한 통찰력이 없었습니다. reguests는 가정에서 동시에 잘 진행되었습니다.

필자는 그 분야에서 경험이 많지 않지만, 응답 스트림이 완전히 수신되기 전에 타이머가 새로운 요청을 트리거하면 어떻게되는지 예를 들어 보겠습니다. 타임 아웃 시간은 타이머 간격과 동일합니까? 여기 병목이 될 수있는 다른 힌트가 있습니까?

답변

1

어떻게 받고있는 데이터입니다 청크 있는지 확인 첫째,이 경로에 가기 전에? 스트림을 통해 데이터를 읽으십니까? 그리고 Stream.Read에 입력 매개 변수로 반환 된 contentsize를 사용하고 있습니까? 완전히 알려지지 않은 Stream.Read의 기능은 요청한 데이터의 양을 반환하는 것이 보장되지 않는다는 것입니다. 다음과 같은 기능을

public abstract int Read(byte[] buffer, int offset, int count) 

를 호출하면 실제로 읽은 얼마나 많은 데이터를 반환합니다. 따라서 1000을 읽고 400을 반환하도록 요청할 수 있습니다. 그렇다면 600 바이트의 읽기가 남아 있습니다. 즉, 0을 반환 할 때까지 계속 Read를 호출해야한다는 것을 의미합니다 (즉, 스트림에 더 이상 데이터가 없음을 의미).

콘텐츠 길이 헤더 정보를 사용하여 버퍼의 크기를 조정하면 안됩니다. 대신 동적 크기의 버퍼 (예 : MemoryStream 객체를 사용하여)를 만들고 응답 스트림에서 0을 반환 할 때까지 읽어야합니다. 적어도 어떻게하면 그렇게 할 수 있습니까? 그런 다음 서버가 구현을 변경하여 더 이상 해당 응답 헤더를 보내지 않으면 솔루션이 계속 작동합니다. XML을로드 중이므로 XmlDocument를 만들고 HTTP 응답 스트림에서 직접로드하도록 요청하십시오.

+0

힌트를 주셔서 감사합니다. 실제로 Stream.Read 메서드를 오용 한 것으로 보입니다. – rdoubleui

1

해결책은 간단합니다. 응답 처리를 마친 후에 만 ​​타이머를 시작하십시오.

+0

내가 원했던 것 같아.그것은 내가 그것을 돌볼 필요가 있다면 말함으로써 의미하는 바를 대답했다. 나는 단지 내가 10 초 만에 4KB를받을 수 없다는 것을 믿을 수 없었다. – rdoubleui

+0

그러나 또한 나는 타이머가 특정 간격을 제어하는 ​​데 쓸모 없을 것입니다. 어쩌면 연결 품질에 따라 달라 지므로 해당 간격으로 응용 프로그램을 강제로 실행해서는 안됩니다. – rdoubleui

0

연결하려는 다른 서버 인 경우 서버의 응답도 '청크 (chunked)'될 수 있습니다. httpwebrequest에 청크 서버에서 전체 파일을 반환하지 않는 버그가 있습니다.

이 경우, 서버에 http 트래픽에 대해 '청크 모드'가 설정되어 있지 않은지 확인하십시오.

또는 도달 범위를 벗어난 경우 직접 요청을 보내고 일반 소켓을 사용하고 http 요청을 보내면 전체 결과가 반환됩니다.

이 모드 문제가 여기

R

+0

청크 모드도 옵션이 될 수 있습니다. 자세한 내용을 알아 보도록하겠습니다. 비록 내가 말했듯이, 그 네트워크에서 트래픽과 어떻게 든 연결 되어야만하지만, 동시에 다른 가정의 PC에서 작동합니다. 내가 뭔가를 발견하면 나는 피드백을 줄 것이다. – rdoubleui