メソッドが「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);
}
これは ドキュメントで指定 です。基本的にGETリクエストは本文を含むことを意図していないため、BeginGetRequestStream
を呼び出す合理的な理由はありません。
GETリクエストがContent-Typeを送信することは意味がありますか? 3行目を削除してみましたか?
GetRequestStreamのドキュメントでは、メソッドがGETの場合にProtocolViolationExceptionをスローするように指定されています。ただし、 HTTP spec には何も見つからず、これは実際にはHTTPプロトコル違反であると示唆されます。これを挑戦と考えてください。
BeginGetRequestStreamは、リクエストにデータを書き込むためのストリームを取得するために使用されます。これはGETリクエストには適用されません。
BeginGetRequestStreamメソッドのドキュメントには、メソッドがGETまたはHEADの場合にメソッドがProtocolViolationExceptionをスローすることが明記されています。
士気:ドキュメントを読む;-)