.NET で基本的な RESTful サービスを作成しました。これにより、呼び出し元のメソッドで指定された Uri に対して基本的な Get および Post 呼び出しを行うことができます。post メソッドで、HttpWebRequest を使用して GetRequestStream を呼び出そうとしていますが、「この動詞タイプのコンテンツ本文を送信できません」というメッセージとともに ProtocolViolationException が発生します。
これは、HttpWebRequest メソッドを Get に設定することで発生する可能性があることはわかっていますが、GetRequestStream 呼び出しが行われたときにメソッドが Post であることをデバッグして確認しました。なぜこれが投げられているのか分かりません。誰でも私を助けることができますか?コードは以下ですpublic HttpWebResponse Get(bool followRedirect = true)
{
_webRequest.Method = WebRequestMethods.Http.Get;
_webRequest.AllowAutoRedirect = followRedirect;
_webRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
var webResponse = _webRequest.GetResponse() as HttpWebResponse;
_webRequest.CookieContainer.Add(webResponse.Cookies);
return webResponse;
}
public HttpWebResponse Post(string contentType, Dictionary<String,String> parameters, bool followRedirect = true)
{
_webRequest.Method = WebRequestMethods.Http.Post;
_webRequest.AllowAutoRedirect = followRedirect;
var postData = "";
foreach (var parameter in parameters)
{
postData += HttpUtility.UrlEncode(parameter.Key) + "=" +
HttpUtility.UrlEncode((parameter.Value)) + "&";
}
postData = postData.Remove(postData.Length - 1, 0);
var data = Encoding.UTF8.GetBytes(postData);
_webRequest.ContentType = contentType;
var requestStream = _webRequest.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
var webResponse = _webRequest.GetResponse() as HttpWebResponse;
return webResponse;
}
編集
_webRequest.GetResponse() を呼び出すことによって問題が発生していることを発見し、その後、同じ _webRequest を使用して GetRequestStream() を呼び出しました。この種の動作は想定されていますか? つまり、再初期化/リセットが必要になる前に、WebRequest はこれらの呼び出しの 1 つだけを行うことができますか?
基本的に Post で新しい WebRequest を作成し、_webRequest から値をコピーすることで修正しましたが、それが必要かどうか、またはより堅牢なソリューションが可能かどうかを知りたいです。