我在 .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 在需要重新初始化/重置之前是否只能进行其中一个调用?
我基本上通过在 Post 中创建一个新的 WebRequest 并将值从 _webRequest 复制到它来进行修复,但我想知道这是否有必要或者是否有可能提供更强大的解决方案。