新发的日常解惑——C# HTTP POST,多次执行报错:(System.Net.WebException:请求已中止:请求已被取消)

一、前言

最近在做一个数据打点的功能,服务端提供了一个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 资源。

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页