我在使用httpclient 发送数据的时候。 都是同一个主机,当第一个URL发送成功的时候,
我紧接着发送第二个URL请求,结果不是长连接。导致上传失败,请大家帮忙解决下:
private static readonly HttpClient _httpClient;
private static readonly string host = "https://funcpaasupgrade.abc.cn:10922";
static HttpClientTest()
{
_httpClient = new HttpClient() {BaseAddress = new Uri(host)};
_httpClient.DefaultRequestHeaders.ConnectionClose = false;
_httpClient.DefaultRequestHeaders.Connection.Add("keep-alive");
}
下面是执行2个URL
var response = await _httpClient.PostAsync("/upgrade/device/package/start?workId=2222", new StringContent(json));
return await response.Content.ReadAsStringAsync();
这个成功了,
// //问题就在这里 上传的时候链接断开了 重新一个新链接
var requestContent =
await _httpClient.PostAsync("/upgrade/device/package/" + startLength, new ByteArrayContent(buffer));
return await requestContent.Content.ReadAsStringAsync();
抓包的时候发现第一个URL请求带上了connection:close 请问如何解决 谢谢
http本来就不是长链接啊
建议确认一下请求第一个URL时,服务端响应头有没有返回 Connection:keep-alive
对方说我请求有Connection: close
@~紫鱼~: 改为 _httpClient.DefaultRequestHeaders.Add("Connection", "keep-alive"); 试试
有这样的需求为什么不是用长连接的websocket,而是用短链接的http。http当然是发一次断一次了
http1.1的协议 默认是Connection:keep-alive 即使不指定也是保持会话连接 复用tcp连接
但connection:close 一般是 服务响应才会有这个,一般情况下只有服务器发生异常 才会指定返回 close 然后服务器关闭tcp 通知client 也顺便关闭。
是的,问题已经找到了 需要清楚头部信息 再添加KEEP-ALIVE
解决办法:1. 清除头部信息
_httpClient.DefaultRequestHeaders.Connection.Clear();
_httpClient.DefaultRequestHeaders.ConnectionClose = false;
2. 服务器开启HTTP1.1协议
就可以了