最近在做一个数据打点的功能,服务端提供了一个HTTP接口,客户端通过HTTP POST的方式上报数据给服务端。
数据格式以json为格式。
运行过程中,发现多次调用上报接口时,会出现报错:
System.Net.WebException:请求已中止:请求已被取消
问题所在:没有设置HttpWebRequest.KeepAlive = false;
解决办法就是设置HttpWebRequest.KeepAlive = false;
//using System;
//using System.Collections.Generic;
//using System.Collections.Specialized;
//using System.IO;
//using System.Linq;
//using System.Net;
//注:参数postData是json格式的字符串
public static string DoHttpPost(string url, string postData)
{
HttpWebRequest request = WebRequest.CreateHttp(url);
request.Method = "POST";
request.Accept = "application/json";
request.ContentType = "application/json;charset=UTF-8";
request.KeepAlive = false;
request.Timeout = 5000;
byte[] bytes = Encoding.UTF8.GetBytes(postData);
request.ContentLength = bytes.Length;
Stream writer = request.GetRequestStream();
writer.Write(bytes, 0, bytes.Length);
writer.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
string result = "";
if (null != responseStream)
{
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
result = reader.ReadToEnd();
}
response.Close();
return result;
}
四、补充:关于HTTP KeepAlive
当一个客户端向服务器发送http请求时,两者之间会建立一个tcp连接,然后服务器发回响应信息同时关闭连接。如果请求的的页面中含有别的资源连接,比如图片、flsah等,就会再次创建连接。KeepAlive的作用就是在第一次创建连接时,服务器会把这个tcp连接保持一段时间(服务器端会有一个keepaliveTime的最大时间,超过时间就断开连接)。这样就不会频繁的去建立tcp连接,同一次请求中的信息传递都可以使用同一个tcp连接。
打 开 KeepAlive 后,意味着每次用户完成全部访问后,都要保持一定时间后才关闭会关闭 TCP连接,那么在关闭连接之前,必然会有一个服务器进程对应于该用户而不能处理其他用户,假设 KeepAlive 的超时时间为 10秒种,服务器每秒处理 50 个独立用户访问,那么系统中 Apache 的总进程数就是 10 * 50 = 500 个,如果一个进程占用4M 内存,那么总共会消耗 2G 内存,所以可以看出,在这种配置中,相当消耗内存,但好处是系统只处理了 50次 TCP的握手和关闭操作。
如果关闭 KeepAlive,如果还是每秒50个用户访问,如果用户每次连续的请求数为3个,那么 Apache 的总进程数就是 50 *3 = 150 个,如果还是每个进程占用 4M 内存,那么总的内存消耗为 600M,这种配置能节省大量内存,但是,系统处理了 150次 TCP 的握手和关闭的操作,因此又会多消耗一些 CPU 资源。



