상세 컨텐츠

본문 제목

C# HttpWebRequest의 '이 verb-type으로 content-body를 보낼 수 없습니다.' 예외에 대한 정리

프로그래밍/C#

by TickTack 2022. 6. 30. 16:02

본문

이번에는 HttpWebRequest 클래스와 관련된 기능을 사용하는 도중 '이 verb-type으로 content-body를 보낼 수 없습니다.' 라는 예외가 발생하였을 때 해결법에 대하여 알아보겠습니다.

먼저 예외 발생당시 상황입니다.

 

ProtocolViolationException 예외 발생 모습

 

HttpWebRequest를 생성하고 일부 설정을 해준 후 GetRequestStream()만 사용했을 뿐인데 예외가 발생한 상황입니다.

아래의 내용은 해당 예외에 대한 아래의 해외 사이트에 있는 HTTP 참고 원문 중 일부를 가져온 것입니다.

아래 사이트의 4.3 part에 관련된 내용이 있습니다.

 

http://www.faqs.org/rfcs/rfc2616.html

 

A message-body MUST NOT be included in
a request if the specification of the request method (section 5.1.1)
does not allow sending an entity-body in requests. A server SHOULD
read and forward a message-body on any request; if the request method
does not include defined semantics for an entity-body, then the
message-body SHOULD be ignored when handling the request.

 

내용을 보면 다음과 같은 부분이 있습니다. (영어 실력이 전문가는 아니라서 구글 번역기를 돌렸습니다...)

 

엔티티 본문을 보내는 것을 허용하지 않는 경우 메시지 본문은 요청에 포함되어서는 안 됩니다

 

그리고 추가로 .Net은 Body가 포함된 Get Request를 지원하지 않는다고 합니다.

따라서 해당 오류 발생의 원인은 HttpWebRequest의 Method를 GET으로 설정한 상태에서 GetRequestStream 함수를 동작시켰기 때문이라고 추측이 가능합니다.

Http를 기술적으로 접근했을 때는 원래 불가능하지 않는 부분이지만 별도로 막아놓아서 오류가 발생하는 것 같습니다.

따라서 GetRequestStream 함수를 쓸 때는 Method가 GET 방식이 아닐 때만 동작시켜주면 될 것입니다.

 

if (httpWebRequest.Method != GET)
{
    Stream dataStream = httpWebRequest.GetRequestStream();
    ...
}

 

이런식으로 운용하면 해당 예외는 발생하지 않는 것을 확인할 수 있습니다.

지금까지 HttpWebRequest 클래스의 GET 요청에 대한 예외 해결 방법에 대하여 알아보았습니다.

관련글 더보기

댓글 영역