C#中HttpWebRequest报错:无法使用该动词类型发送请求体
咱们先把这个错误的根源说清楚:你遇到的这个问题,核心是你使用的HTTP请求方法(大概率是GET)不允许携带请求体。虽然HTTP标准没有完全禁止GET带请求体,但.NET的HttpWebRequest类严格遵循了通用的HTTP实践,直接限制了这种操作,所以当你给GET请求写请求体的时候就会触发这个报错。
看你的代码,你通过webRequest.Method = requestType.ToString();设置请求方法,这里如果requestType对应的是GET,就会和后面写入请求体的代码冲突——这就是问题的关键。
接下来给你两个针对性的解决方案:
方案一:改用POST请求(最推荐的方式)
如果你的服务器接口支持POST方法,直接把请求方法改成POST就可以了,因为POST就是用来提交数据到服务器的,带请求体是标准操作:
webRequest.Method = "POST";
另外注意你代码里的一个小问题:msg里用了&(HTML实体编码的&),这不对,application/x-www-form-urlencoded格式里的参数分隔符是直接用&,所以要改成:
string msg = String.Format("UserName={0}&Password={1}&AuthMethod=FormsAuthentication", System.Net.WebUtility.UrlEncode(username), System.Net.WebUtility.UrlEncode(password));
这个修改后,POST请求就能正常携带表单数据了。
方案二:必须用GET的话,把参数拼到URL查询字符串里
如果服务器只接受GET请求,那你不能把参数放在请求体里,得把它们拼接到请求URL的查询部分:
// 先构建URL编码后的查询参数 string queryParams = String.Format("UserName={0}&Password={1}&AuthMethod=FormsAuthentication", System.Net.WebUtility.UrlEncode(username), System.Net.WebUtility.UrlEncode(password)); // 拼接成新的请求URL Uri newRequestUri = new Uri(responseUri + "?" + queryParams); // 用新URL创建请求 WebRequest webRequest = WebRequest.Create(newRequestUri); // 这里要删除所有和请求体相关的代码: // 1. 删掉 webRequest.ContentType = "application/x-www-form-urlencoded"; (GET请求不需要这个) // 2. 删掉 webRequest.ContentLength = msg.Length; // 3. 删掉从Stream reqStream = ...到reqStream.Close();的整个代码块
这样GET请求就会通过URL携带参数,不会触发请求体的错误了。
最后再提醒一下:如果用POST方案,你之前设置的ContentType = "application/x-www-form-urlencoded"是正确的,不需要修改;而GET方案里,这些和请求体相关的设置都要去掉,避免多余的配置引发其他问题。
内容的提问来源于stack exchange,提问作者Robert

