ASP.net HttpRequest上的静态HttpClient线程安全
发布时间:2020-12-16 04:17:27 所属栏目:asp.Net 来源:网络整理
导读:我们正在为HttpClient创建一个包装器.因为我们将遵循 https://github.com/mspnp/performance-optimization的性能优化指南.我们希望避免反模式 – 该文档中提到的不正确的实例化.我将此指南提交给我的团队使用静态HttpClient.我得到的反馈是线程安全性.每个请
我们正在为HttpClient创建一个包装器.因为我们将遵循
https://github.com/mspnp/performance-optimization的性能优化指南.我们希望避免反模式 – 该文档中提到的不正确的实例化.我将此指南提交给我的团队使用静态HttpClient.我得到的反馈是线程安全性.每个请求都有一个包含用户声明的标头.由于我有一个静态的HttpClient,它是否是线程安全的?如果我们同时有多个请求命中代码(例如GET),那么设置标题是否会出现竞争条件?我们的实施如下.
public class HttpClientHelper{ private static readonly HttpClient _HttpClient; static HttpClientHelper() { HttpClient = new HttpClient(); HttpClient.Timeout = TimeSpan.FromMinutes(SOME_CONFIG_VALUE); } public async Task<HttpResponseMessage> CallHttpClientPostAsync(string requestUri,HttpContent requestBody) { AddHttpRequestHeader(httpClient); var response = await httpClient.PostAsync(requestUri,requestBody); //Potential thread synchronization issue??? return response; } public HttpResponseMessage CallHttpClientGet(string requestUri) { AddHttpRequestHeader(httpClient); var response = httpClient.GetAsync(requestUri).Result; //Potential thread synchronization issue??? return response; } private void AddHttpRequestHeader(HttpClient client) { string HeaderName = "CorrelationId"; client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(Properties.Settings.Default.HttpClientAuthHeaderScheme,GetTokenFromClaims()); //Race condition??? if (client.DefaultRequestHeaders.Contains(HeaderName)) client.DefaultRequestHeaders.Remove(HeaderName); client.DefaultRequestHeaders.Add(HeaderName,Trace.CorrelationManager.ActivityId.ToString()); } } 解决方法
你的团队是正确的,这远非线程安全.考虑这种情况:
>线程A将CorrelationId标头设置为“foo”. 更好的方法是使用CallXXX方法创建新的HttpRequestMessage对象,并在其上设置标题,并使用HttpClient.SendAsync进行调用. 请记住,重新使用HttpClient实例仅在您对同一主机进行多次调用时才有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 为什么在ASP.NET中刷新页面时会执行按钮单击事件?
- ASP.NET和C#重定向
- asp.net-mvc – 可以在运行时更改数据注释吗? (ASP.NET MV
- 对VS 2019中ASP.NET Core项目解决:The term 'Add-Migr
- asp.net – SSO表单身份验证问题.无法解密身份验证Cookie
- asp.net-mvc – 具有相同签名的ASP.NET MVC 1.0控制器操作
- asp.net-mvc-2 – 如何使用控制器的模型提供ASP.NET MVC2母
- asp.net – 不允许使用用于访问路径’/test.html’的HTTP谓
- entity-framework-4 – 在多层体系结构中使用Autofac
- asp.net-mvc – 如何在ASP.NET MVC视图中访问路由参数?
推荐文章
站长推荐
- asp.net – Json.Net IsoDateTimeConverter无效
- asp.net-mvc – 自定义模型绑定,模型状态和数据注
- 带有MS Chart的ASP.NET禁用垂直线
- asp.net-mvc – ASP.Net MVC网址设计和结构指南
- asp.net-mvc-3 – 在ajax发布之前使用unobtrusiv
- 动手造轮子:实现一个简单的依赖注入(三) --- 支
- 分布式数据访问服务之1—华山论剑篇
- 使用 MiniProfiler 来分析 ASP.NET Core 应用
- 如何在ASP.Net GridView中使用AutoGenerateEditB
- asp.net-mvc – 如何在ASP.NET应用程序中设置S-M
热点阅读