이 동사 유형으로 콘텐츠 본문을 보낼 수 없습니다.


95

내 .NET 2.0 앱 (Windows Mobile 6 표준 에뮬레이터에서 실행)에서이 예외 (ProtocolViolationException)가 발생했습니다. 저를 혼란스럽게하는 것은 제가 아는 한 어떤 콘텐츠 본문도 추가하지 않았다는 것입니다. 내 코드는 다음과 같습니다 (매우 간단합니다). 이것이 단지 http GET이라는 것을 .NET을 설득하기 위해해야 ​​할 다른 일이 있습니까?

고마워, 브라이언

//run get and grab response
WebRequest request = WebRequest.Create(get.AbsoluteUri + args);
request.Method = "GET";
Stream stream = request.GetRequestStream();           // <= explodes here
XmlTextReader reader = new XmlTextReader(stream);

답변:


152

아주 간단하게 요청 스트림을 얻지 마십시오. 요청하지 않는 GET 일반적으로 (그것이 비록 몸이 기술적으로 HTTP에 의해 금지되지 ) 및 WebRequest하지만 호출이의이 -를 지원하지 않는 GetRequestStream요청에 대한 본문 데이터를 제공하기위한 것입니다.

스트림에서 읽으 려고 한다면 실제로 응답을 받고 응답 스트림을 읽고 싶어하는 것처럼 보입니다 .

WebRequest request = WebRequest.Create(get.AbsoluteUri + args);
request.Method = "GET";
using (WebResponse response = request.GetResponse())
{
    using (Stream stream = response.GetResponseStream())
    {
        XmlTextReader reader = new XmlTextReader(stream);
        ...
    }
}

14
기술적으로 GET 요청은 본문을 가질 수 있지만 .NET은 본문이있는 GET 요청 생성을 지원하지 않습니다. stackoverflow.com/questions/2064281/…
mhud

1
@JonSkeet 당신은 천재이거나 뭔가되어야합니다. 그것이 바로 내 문제를 해결 한 것입니다. +1.
Eternal Learner

3
@EternalLearner 당신은 거꾸로 가지고 있습니다. 올바른 표현은 "천재 야, 너는 스키트 같은 사람 이겠지."입니다. :) 이것도 저를 분류했고, Skeet 씨를 1M으로 돕고 있다는 것을 깨닫기 전에 응답자에게 +1을주었습니다.
Dan Solovay

@ JonSkeet, HttpClient및 사용하여 콘텐츠 본문과 함께 GET 요청을 보내는 방법이 HttpRequestMessage있습니까?
Shimmy Weitzhandler

@JonSkeet NM 여기에 내 대답이 있습니다 .
Shimmy Weitzhandler

5

Flurl.Http를 사용하여 비슷한 문제가 발생했습니다.

Flurl.Http.FlurlHttpException: Call failed. Cannot send a content-body with this verb-type. GET http://******:8301/api/v1/agents/**** ---> System.Net.ProtocolViolationException: Cannot send a content-body with this verb-type.

문제는 .WithHeader("Content-Type", "application/json")IFlurlRequest를 만들 때 사용 되었습니다.


2

헤더를 지정하지 않았기 때문입니다.

확장 된 예를 추가했습니다.

var request = (HttpWebRequest)WebRequest.Create(strServer + strURL.Split('&')[1].ToString());

헤더 (참조 요청, p_Method);

그리고 메소드 헤더 :

private void Header(ref HttpWebRequest p_request, string p_Method)
{
    p_request.ContentType = "application/x-www-form-urlencoded";
    p_request.Method = p_Method;
    p_request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE)";
    p_request.Host = strServer.Split('/')[2].ToString();
    p_request.Accept = "*/*";
    if (String.IsNullOrEmpty(strURLReferer))
    {
        p_request.Referer = strServer;
    }
    else
    {
        p_request.Referer = strURLReferer;
    }
    p_request.Headers.Add("Accept-Language", "en-us\r\n");
    p_request.Headers.Add("UA-CPU", "x86 \r\n");
    p_request.Headers.Add("Cache-Control", "no-cache\r\n");
    p_request.KeepAlive = true;
}

-7

응답 스트림을 읽기 전에 요청 콘텐츠 유형을 설정하십시오.

 request.ContentType = "text/xml";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.