web-dev-qa-db-ja.com

GETメソッドでHttpWebRequestを使用する方法

メソッドが「POST」のときにうまく機能する次のコードがありますが、「GET」に変更しても機能しません。

HttpWebRequest request = null;
request = HttpWebRequest.Create(uri) as HttpWebRequest;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Method = "POST"; // Doesn't work with "GET"

request.BeginGetRequestStream(this.RequestCallback, null);

「GET」メソッドでProtocolViolationException例外が発生します。

編集: Reflectorを使用して確認した後、例外がスローされるように設定されている場合、「GET」メソッドの明示的なチェックがあるようです。

Edit2:コードを次のように更新しましたが、EndGetResponse()を呼び出すと例外がスローされます

if (request.Method == "GET")
{
    request.BeginGetResponse(this.ResponseCallback, state);
}
else
{
    request.BeginGetRequestStream(this.RequestCallback, state);
}

私の関数、ResponseCallbackには、これがあります:

HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

これも例外をスローします。

回答

上記のコードが機能するようになりました。Content-Type行を削除するのを忘れていたため、最後に例外がスローされていました。 +1を調整してジョンに答えます。

作業コードは次のとおりです。

HttpWebRequest request = null;
request = HttpWebRequest.Create(uri) as HttpWebRequest;
request.Method = "GET";// Supports POST too

if (request.Method == "GET")
{
    request.BeginGetResponse(this.ResponseCallback, state);
}
else
{
    request.BeginGetRequestStream(this.RequestCallback, state);
}
28
Mark Ingram

これは ドキュメントで指定 です。基本的にGETリクエストは本文を含むことを意図していないため、BeginGetRequestStreamを呼び出す合理的な理由はありません。

12
Jon Skeet

GETリクエストがContent-Typeを送信することは意味がありますか? 3行目を削除してみましたか?

5
Mark Renouf

GetRequestStreamのドキュメントでは、メソッドがGETの場合にProtocolViolationExceptionをスローするように指定されています。ただし、 HTTP spec には何も見つからず、これは実際にはHTTPプロトコル違反であると示唆されます。これを挑戦と考えてください。

1
MarkPflug

BeginGetRequestStreamは、リクエストにデータを書き込むためのストリームを取得するために使用されます。これはGETリクエストには適用されません。

BeginGetRequestStreamメソッドのドキュメントには、メソッドがGETまたはHEADの場合にメソッドがProtocolViolationExceptionをスローすることが明記されています。

士気:ドキュメントを読む;-)

1
Tor Haugen