문제

우리는 응용 프로그램을 사용하여 응용 프로그램을 호스팅하기 위해 HTTP 위에 존재하는 응용 프로그램을 위해 C#에 포괄적 인 통합 테스트 프레임 워크를 구축하고 있습니다.

통합 테스트의 일환으로 고객이 실제로 HTTP 헤더를 보낼 때 발생하는 endofstreamexeceptions ( "스트림 끝 너머로 읽을 수 없음")를 초래할 수있는 수신 요청을 테스트하려고합니다. 몸. 이 조건에 대한 오류 복구 코드를 테스트하려면 이러한 종류의 요청을 시뮬레이션해야합니다.

개발자가 이러한 조건을 시뮬레이션하여 통합 테스트 스위트에 추가 할 수있는 .NET FX 기반 소켓 라이브러리 또는 사용자 정의 HTTPWebRequest 교체를 찾고 있습니다. 그런 도서관을 아는 사람이 있습니까? 스크립트 가능한 솔루션도 작동합니다.

도움이 되었습니까?

해결책

getRequestStream (또는 BegingEtrequestStream)을 호출하기 전에 ContentLength 속성을 설정 한 다음 해당 스트림에 바이트를 적게 씁니다. 요청 스트림을받은 후 설정하려고하면 ContentLength가 던져집니다. ContentLength를 설정하지 않으면 HTTPWEBREQUEST는 스트림이 닫힐 때까지 헤더를 버퍼링하여 ContentLength를 적절하게 설정할 수 있도록 헤더를 버퍼링합니다 (대체로 SendChunked를 사용할 수 있지만 여기서는 작동하지 않습니다). 이에 대한 최대 제어를 원한다면, 말로 된 요청 또는 2 개의 손으로 두 번의 요청을 작성한 다음 서버의 포트 80에 소켓을 열고 TCP 스트림에 요청을 작성한 다음 응답을 읽고 닫힌 지 확인하십시오. .

그러나 : 나는이 테스트가 좋은 생각이라고 생각하지 않습니다. 문제는 다음과 같습니다.

클라이언트는 서버에 요청을 보냅니다. 내용은 100 바이트가 될 것이라고 주장합니다. 그런 다음 90 바이트를 보내고 전송을 중지하여 연결을 열어줍니다. 서버는 90 바이트를 읽은 다음 클라이언트가 100 바이트가 전송 될 것이라고 말했기 때문에 나머지를 기다립니다. 이제 클라이언트는 두 번째 요청을 보냅니다. 서버는 새 요청의 처음 10 바이트로 무엇을 할 것인가?

대답은 서버가 해당 바이트가 이전 요청의 일부라고 가정하고이를 처리 한 다음 시작 후 "새"요청 10 바이트를 읽기 시작한다는 것입니다. 서버가 마음에 들지 않으므로 4xx 오류가 발생하면 연결이 닫힙니다. 그것이 연결을 닫는 이유는 이제 데이터가 전송되는 데이터가 무엇을 의미하는지 알 수없고 복구 할 방법이 없기 때문입니다. 또한 연결 종료는 우아하지 않을 것이며, 갑자기, 다른 쪽 끝에있는 httpwebrequest는 두 번째 요청을 제출하는 (또는 대기중인 경우 세 번째 또는 네 번째)가 기본 연결이 닫히고 이유를 추측하게합니다.

이 동일한 동작은 Expect 100-Continue 헤더로 연결을 닫게하고 서버는 100 콘티니 누에 반환 한 다음 Auth가 필요할 때와 같은 4xx를 반환합니다. 요청을 거부하더라도, 다음 바이트는 100- 컨티인을 보내서 바이트를 받기 위해 최선을 다했기 때문에 다음 바이트가 동일한 요청의 일부라고 가정해야합니다. 해당 요청을 서비스하지 않거나 고객이 요청을 취소하고 새 요청을 제출하려는 경우 (아마도 새로운 자격 증명으로 요청을 제출하려면) 연결을 닫고 새 요청을 열어야합니다.

마지막으로, TCP를 사용하여 네트워크 스트림에서 endofstreamexception을 테스트하는 것은 전혀 의미가 없습니다. TCP는 스트림의 "끝"을 표시하지 않고 소켓에 기록 된대로 데이터를 계속 전송합니다. 그것에 대한 "EOF"는 없으며, 데이터가 얼마나 예상되는지 알지 않는 한 데이터가 모두 전송되었는지 여부를 감지 할 수있는 방법이 없습니다. 연결이 닫히지 않는 한 TCP는 실제로 스트림에 "종료"가 없습니다.이 경우 스택의 위치에 따라 WebException 또는 Pocketexception을 얻을 수 있습니다. 프로토콜의 모든 전송 오류는 Winsock에서 처리됩니다. 더 이상 데이터가 전송되지 않으면 연결의 한쪽 끝은 결국 다른 사람에게 keepalive를 보내고 연결이 실제로 열려 있고 한 호스트가 그만 두지 않도록합니다. KeepAlive가 시간이되면 연결이 닫히고 다음에 읽으려고 할 때 WebException을 얻을 수 있습니다. 이 모든 것이 어떻게 작동 하는지를 감안할 때, 나는 당신 이이 테스트에서 어떤 가치를 얻을 것인지 알지 못합니다. 오르플 링 요청을 보내고 오류가 그에 따라 처리되고 적절한 4xx 메시지가 클라이언트로 다시 전송되고 연결이 올바르게 닫히도록하는 것이 훨씬 좋습니다.

다른 팁

나는 그런 도서관을 모르지만, 그것이 코딩하는 곳이라면 수신 측에서 매우 간단한 것 같습니다.

WebRequest 전체를 검색하고 원하는만큼 또는 적은 것을 잘라낸 다음 전달하십시오. 그 과정에서 새로운 웹 레퀴 스트 사본을 만들어야 할 수도 있지만, 그 과정에서 자리를 잘라내는 것이 아니라 여전히 간단해야합니다.

당신은 그냥 설정할 수 없어요 HttpWebRequest.ContentLength 클라이언트의 속성은 데이터의 실제 크기보다 작거나 큰 값으로?

HTTP 프로토콜을 위반하는 곳에서 이와 같은 것을 시뮬레이션하려면 자신의 코드를 작성해야합니다. httpwebrequest는 이런 일을 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top