Http Post方法的疑问

摇撼大地 2016-07-06 10:16:31

public static string HttpPost(string Url, string postDataStr="")
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.UTF8);
myStreamWriter.Write(postDataStr);
myStreamWriter.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();

return retString;
}



这里一直报错

测试名称: TestMethodForHttpPost
测试全名: TestForWeChat.TestForMessage.TestMethodForHttpPost
测试源: E:\mycode\WeChatClassLibrary\TestForWeChat\TestForMessage.cs:第 12 行
测试结果: 未通过
测试持续时间: 0:00:00.2321671

结果 的堆栈跟踪:
在 System.Net.ConnectStream.InternalWrite(Boolean async, Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
在 System.Net.ConnectStream.Write(Byte[] buffer, Int32 offset, Int32 size)
在 System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
在 System.IO.StreamWriter.Dispose(Boolean disposing)
在 System.IO.StreamWriter.Close()
在 WeChatClassLibrary.HttpMethodHelper.HttpPost(String Url, String postDataStr) 位置 E:\mycode\WeChatClassLibrary\WeChatClassLibrary\HttpMethodHelper.cs:行号 25
在 TestForWeChat.TestForMessage.TestMethodForHttpPost() 位置 E:\mycode\WeChatClassLibrary\TestForWeChat\TestForMessage.cs:行号 13
结果 的消息:
测试方法 TestForWeChat.TestForMessage.TestMethodForHttpPost 引发了异常:
System.Net.ProtocolViolationException: 写入流的字节超出指定的 Content-Length 字节大小。

这个最后的错误很奇怪。我传的字符串就是空字符串,也不知道为什么就报错。这个是抄的网上的代码,原代码


StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));

这一步他编码用的是gb2312.我就很奇怪了。。。。。为什么不直接用utf8呢
...全文
126 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你不需要设置 request.ContentLength。 我以前在 csdn 回帖贴过一个例子:
public static string EncryptJavascript(this string js)
{
    var web = (HttpWebRequest)WebRequest.Create("http://tool.css-js.com/actions/jspacker.php?type=encode");
    web.Method = "POST";
    web.Host = "tool.css-js.com";
    web.Accept = "text/plain";
    web.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36";
    web.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
    web.Headers.Add("Accept-Language", "zh-CN,zh");
    var content = string.Format("code={0}", HttpUtility.UrlEncode(js));
    var data = Encoding.UTF8.GetBytes(content);
    using (var rq = web.GetRequestStream())
        rq.Write(data, 0, data.Length);
    using (var rs = web.GetResponse())
    using (var rd = rs.GetResponseStream())
    using (var rm = new StreamReader(rd))
        return rm.ReadToEnd();
}
Poopaye 2016-07-06
  • 打赏
  • 举报
回复
不要自己设定Content-Length,c#会帮你搞定的
software_artisan 2016-07-06
  • 打赏
  • 举报
回复
对方接口没响应吧,问题不见得出在你这里。
  • 打赏
  • 举报
回复
将request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr); 这句删掉试试。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧