使用HttpClient请求,问题记录
上篇博客说到使用单例HttpClient,以GET请求方法为例。可以看到对于Http请求头中Authorization参数,会根据传入的accessToken是否为空来判断是否添加此请求头。
public async Task<HttpResponseMessage> GetRequestAsync(string requestUri, string accessToken)
{
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, requestUri);
if (!string.IsNullOrEmpty(accessToken))
{
message.Headers.Add("Authorization", "Bearer " + accessToken);
}
try
{
var response = await _httpClient.SendAsync(message);
//var response = await this._client.GetAsync(requestUri);
if (response.IsSuccessStatusCode)
{
return response;
}
else
{
throw new Exception(response.Content.ReadAsStringAsync().Result);
}
}
catch (Exception ex)
{
throw ex;
}
}
假设现在有两类请求,一类accessToken有值,一类accessToken值为null。那么在高并发请求中(两类请求都有),经常会曝出如下异常信息。
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>AuthenticationFailed</code>
<message xml:lang="en-US">Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:6c793977-1002-0001-25dc-9ace78000000
Time:2018-12-23T16:24:40.3625699Z</message>
</error>
之前一直以为是并行代码有问题,因为使用串行代码执行是能正常运行的。后来测试的时候对并行请求那块代码加lock锁,同样会报这个错误。那么说明并行代码应该是没问题的。
因为报这个错误的请求都是accessToken为null的这类请求。而这类请求由于做了判断,请求头中并不应该有Authorization参数,而异常信息却说我的Authorization格式不正确,那么
似乎是accessToken为null的这类请求的请求头中有key为Authorization的请求头,只是value值不正确,但这类请求是不应该有key为Authorization的请求头的。
后来看到这篇文档(https://mitra.computa.asia/articles/msdn-azure-batch-server-failed-authenticate-request),发现是因为客户端的代理层(proxy layer)会缓存请求信息。也就是说在高并发请求中,带Authorization请求头的请求会缓存下来(而我猜测这因为有一个很短的过期时间,不然就无法解释串行请求是正常的),当切换到不应该带Authorization请求头的请求时(因为Authorization请求头的值为空),就会出现此异常。所以我们需要将Proxy禁用掉就可以的。
//创建HttpClient对象时,禁用Proxy
HttpClientHandler handler = new HttpClientHandler()
{
UseProxy = false
};
_httpClient = new HttpClient(handler);
或者也可以使用如下方式禁用客户端Proxy
<system.net>
<requestCaching defaultPolicyLevel="NoCacheNoStore"/>
</system.net>
这样客户端Proxy就不会缓存Http信息了,两类请求在高并发场景下也能互不干扰。
使用HttpClient请求,问题记录的更多相关文章
- httpclient请求方法
/** * httpclient请求方法 * @param url 请求地址 * @param paramMap 请求参数 * @param ent 编码格式 gbk.utf-8 * @return ...
- HttpClient请求服务器代码优化版
HttpClient请求服务器代码优化版 首先,我在前面的两篇博文中介绍了在 Android中,除了使用java.net包下HttpUrlConnection的API访问HTTP服务之外,我们还可以换 ...
- 通过HttpClient请求webService
通过HttpClient请求webService 由于服务端是用webService开发的,android要调用webService服务获取数据,这里采用的是通过HttpClient发送post请求, ...
- C# HttpClient 请求认证、数据传输笔记
目录 一,授权认证 二,请求类型 三,数据传输 C# HttpClient 请求认证.数据传输笔记 一,授权认证 客户端请求服务器时,需要通过授权认证许可,方能获取服务器资源,目前比较常见的认证方式有 ...
- SpringMVC获取HttpClient 请求的数据
package com.nnk.upstream.controller;import org.springframework.util.StreamUtils;import javax.servlet ...
- 如何从Serilog请求日志记录中排除健康检查终结点
这是在ASP.NET Core 3.X中使用Serilog.AspNetCore系列文章的第四篇文章:. 第1部分-使用Serilog RequestLogging减少日志详细程度 第2部分-使用Se ...
- .NetCore简单封装基于IHttpClientFactory的HttpClient请求
IHttpClientFactory是什么?为什么出现了IHttpClientFactory 一.IHttpClientFactory是什么? IHttpClientFactory是.netcore2 ...
- .NET Core HttpClient请求异常详细情况分析
前言 最近项目上每天间断性捕获到HttpClient请求异常,感觉有点奇怪,于是乎观察了两三天,通过日志以及对接方沟通确认等等,查看对应版本源码,尝试添加部分配置发布后,观察十几小时暂无异常情况出现, ...
- dubbo系列二、dubbo请求流程记录
目录 1.dubbo请求处理流程 1.1. consumer端处理流程 1.2.provider端处理流程 1.3.dubbo请求分析记录-图 泳道图 xmind图 2.dubbo请求核心说明 1.d ...
随机推荐
- HDU 5288 OO’s Sequence
题意: 给你一个序列, 有一个函数 F(L,R) 其中 ai 均不能 被 aL - aR整除的 函数值是这个ai个数 思路 : 反过来求 满足这样的条件的 ai 的区间,然后求和 #include& ...
- SonarQube代码质量管理工具安装与使用(sonarqube5.1.2 + sonar-runner-dist-2.4 + MySQL5.x)
1. SonarQube安装(sonarqube5.1.2 + sonar-runner-dist-2.4) 1.1 前提条件 1) 已安装Java环境(version:1.7+) 2) 已安装MyS ...
- Jquery hover方法使用及 mouseenter与mouseleave和 mouseover与mouseout的区别
定义和用法 hover() 方法规定当鼠标指针悬停在被选元素上时要运行的两个函数. jQuery 1.7 版本前该方法触发 mouseenter 和 mouseleave 事件. jQuery 1.8 ...
- Codeforces 5C Longest Regular Bracket Sequence(DP+括号匹配)
题目链接:http://codeforces.com/problemset/problem/5/C 题目大意:给出一串字符串只有'('和')',求出符合括号匹配规则的最大字串长度及该长度的字串出现的次 ...
- poj3067 二维偏序树状数组
题解是直接对一维升序排列,然后计算有树状数组中比二维小的点即可 但是对二维降序排列为什么不信呢?? /* */ #include<iostream> #include<cstring ...
- javaFX中解决填充(拉伸)问题
1.margin设置实现 在项目过程中,遇到此问题,如图: 如果窗口缩小,HBox(左边的包含TitledPane那部分)看不到底部 如果窗口拉大,下面就出现空白,HBox高度没拉神 办法:对包含HB ...
- 存储过程+Jquery+WebService实现三级联动:
首先看一下数据库的设计:
- Tomcat下指定JDK
- la 4394
题解: 区间dp 令f[i][j]表示搞好i-j的最小值 首先如果不用涂色 那么可以从f[i][k] f[k+1][j]转移 如果要涂色,那么就从f[i][k][a](表示i-k全为a)+f[k+1] ...
- [ZJOI2012]数列
超级水的题还wa了一次 首先很容易发现其实就只有两个值并存 然后 要注意把数组初始化啊...可能后面有多余的元素(对拍的时候由于从小到大就没跑出错) #include <bits/stdc++. ...