您的位置:首页 > 理论基础 > 计算机网络

Asp.net core 学习笔记 ( HttpClient )

2017-09-25 11:14 1241 查看
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 的问题我没有遇到, 遇到了才打算呗.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: