Asp.net core 学习笔记 ( HttpClient )
2018-09-18
core 2.1 之后有新的方案咯
http://www.talkingdotnet.com/3-ways-to-use-httpclientfactory-in-asp-net-core-2-1/
就是解决之前单列等等的问题.
给个例子
定义一个 service
public class ServerTaskHttpClient { public HttpClient Client { get; private set; } public ServerTaskHttpClient( HttpClient httpClient, IConfiguration configuration ) { httpClient.BaseAddress = new Uri(configuration["Origin"] + "/api"); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypeNames.Application.Json));
// httpClient.DefaultRequestHeaders.Add(HeaderNames.ContentType, MediaTypeNames.Application.Json); //注意, 放这里是错的, content-type 不是这里 set 的,而是通过 content Client = httpClient; } }
startup.cs
加入依赖 providers
services.AddHttpClient<ServerTaskHttpClient>();
在 controller 调用
public class ResponseData { public bool successful { get; set; } } public async Task<IActionResult> Index() { var content = new StringContent(JsonConvert.SerializeObject(new { name = "dada" }), Encoding.UTF8, MediaTypeNames.Application.Json); var result = await ServerTaskHttpClient.Client.PostAsync("/api/debug/clearImage", content); if (result.IsSuccessStatusCode) { var responseData = JsonConvert.DeserializeObject<ResponseData>(await result.Content.ReadAsStringAsync()); } return View(); }
api
[HttpPost("clearImage")] public async Task<IActionResult> ClearImage(Data data) { return Ok(new { successful = true }); }
2017-09-25
core 和 .net 4.5 一样都可以使用 HttpClient
没什么特别的, 只是在学习的时候发现一个之前没留意到的问题.
refer :
https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
http://byterot.blogspot.my/2016/07/singleton-httpclient-dns.html
http://www.cnblogs.com/dudu/p/csharp-httpclient-attention.html
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client
http://www.cnblogs.com/Wddpct/p/6229090.html
大致上说的是, HttpClient 不要使用 using, 因为它并不会释放 TCP 连接, 应该在整个应用里把 HttpClient 设置成单列
core 要设置单列对象很容易
public class VisautoHttpClient : HttpClient { public VisautoHttpClient() { BaseAddress = new Uri("http://visauto.stooges.com.my"); Timeout = TimeSpan.FromSeconds(30); DefaultRequestHeaders.Clear(); DefaultRequestHeaders.Add("Accept", "text/html"); DefaultRequestHeaders.Connection.Add("Keep-Alive"); } }
定义好类, 由于每个 TCP 的 baseAddress 不能换的,所以如果你有很多个不同区的请求要发, 那么建议开多几个 HttpClient 实例.
keep-alive 的目的是让服务端知道我们的连接不要马上断开, 这样发多个请求的话可以快一些.
然后在 startup.cs 提供服务就可以了.
public void ConfigureServices(IServiceCollection services) { // services services.AddSingleton<VisautoHttpClient, VisautoHttpClient>(); }
core 会帮我们搞定 singleton 的线程安全等问题. 不需要像从前还要用 lock 什么的那么麻烦了.
而且这里只是定义,一直到控制器注入时才会初始化实例哦.
在控制器注入了就可以发请求咯~
[Area("Web")] public class HttpController : Controller { public HttpController( VisautoHttpClient httpClient ) { this.httpClient = httpClient; } private HttpClient httpClient { get; set; } [Route("http")] public async Task<IActionResult> Index() { try { string x = await httpClient.GetStringAsync(""); } catch (Exception ex) { } return View(); } }
note : 如果服务器 restart, 我们的连接并不需要任何处理, 都是自动的. 放心, dns 的问题我没有遇到, 遇到了才打算呗.
相关文章
- 你所不知道的ASP.NET Core MVC/WebApi基础系列(一)
- WCF 无法激活服务,由于它不支持 ASP.NET 兼容性。已为此应用程序启用了 ASP.NET 兼容性
- 学习ASP.NET Core Blazor编程系列十五——查询
- 学习ASP.NET Core Blazor编程系列十六——排序
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)
- 《ASP.NET Core应用开发入门教程》与《ASP.NET Core 应用开发项目实战》正式出版
- 无法激活服务,因为它不支持 ASP.NET 兼容性
- ASP.NET OAuth Authorization - Difference between using ClientId and Secret and Username and Password
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
- List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
- C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
- ASP.NET Core知多少:路由重写及重定向
- Asp.Net Core 下 Newtonsoft.Json 转换字符串 null 替换成string.Empty(转)
- Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例
- ASP.NET Core 2.0 使用支付宝PC网站支付
- asp.net mvc4源码
- Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案
- 使用 Autofac, MediatR 和 FluentValidator 构建松耦合 ASP.NET Core API 应用
- ASP.NET Core 中的 Request Feature
- 04. PART 2 IdentityServer4 ASP.NET Core Identity .NET Core 3.1
- ubuntu下发布asp.net core并用nginx代理之旅
- jexus asp.net Linux Web Server
- uniapp跨域调用ASP.NET Core Web API