2

.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 から値をコピーすることで修正しましたが、それが必要かどうか、またはより堅牢なソリューションが可能かどうかを知りたいです。

4

2 に答える 2

1

わかりましたので、問題は _webRequest.GetResponse() を呼び出してから、同じ WebRequest で .GetRequestStream() を呼び出すことから発生していることに気付きました。これがなぜなのか正確にはわかりませんが、それが問題の原因でした。新しい WebRequest を作成し、関連する属性を新しい Request にコピーすることで、この問題を回避しました。

于 2012-10-31T03:01:47.993 に答える