背景:
在NET项目中用 HttpClient 来调用Java的API接口,发现很慢, 调用的java方法执行时间在java项目日志中记录为50ms左右, 但是在C#项目日志中显示调用了1000ms,
这种情况下压力测试很慢,并发量稍微高一点就超时,甚至导致服务内存无法释放,服务下线。
这里只有正确的 代码:
1: 这里需要需要用到单例加锁,不然容易在并发情况下导致大量的实例化 HttpClient
这里需要注意这个HttpClient的一个bug。
必须添加:下面2行代码,解决调用慢的问题,这是dll本身的bug
HttpClientHandler handler = new HttpClientHandler();
handler.UseProxy = false;
public class HttpClientHelper
{
private static HttpClient _client;
private static readonly object _lock = new object();
public static HttpClient GetClient()
{
try
{
if (_client == null)
{
lock (_lock)
{
if (_client == null) {
HttpClientHandler handler = new HttpClientHandler();
handler.UseProxy = false;
_client = new HttpClient(handler);
_client.DefaultRequestHeaders.Connection.Add("keep-alive");
_client.Timeout = new TimeSpan(0, 0, 5);
return _client;
}
}
}
return _client;
}
catch (Exception)
{
return new HttpClient();
}
}
}
2:调用方法,这里需要注意一下 这行代码:
httpClient.DefaultRequestHeaders.Clear();
public static string HttpWebRequestPostJsonNew(string postValues, string url)
{
string returnMsg = null;
HttpClient httpClient = HttpClientHelper.GetClient();
try
{
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
long timeStamp = (long)(DateTime.Now - startTime).TotalMilliseconds;
string signPara = BQNewSysAccount + timeStamp + BQNewSysSecret;
string sign = Sha256Hex(signPara);
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Add("mnappid", BQNewSysAccount);
httpClient.DefaultRequestHeaders.Add("mnsign", sign);
httpClient.DefaultRequestHeaders.Add("mntimestamp", timeStamp.ToString());
var content = new StringContent(postValues, Encoding.UTF8, "application/json");
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var result = httpClient.PostAsync(url, content).Result;
returnMsg = result.Content.ReadAsStringAsync().Result;
return returnMsg;
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
}