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();
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 学习笔记 ( HttpClient )的更多相关文章

  1. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  2. ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

    前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...

  3. Asp.net Core学习笔记

    之前记在github上的,现在搬运过来 变化还是很大的,感觉和Nodejs有点类似,比如中间件的使用 ,努力学习ing... 优点 不依赖IIS 开源和跨平台 中间件支持 性能优化 无所不在的依赖注入 ...

  4. ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用

    前言 首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果.还记得上篇文章中最后提及到,假如服务越来越多怎 ...

  5. ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置

    前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...

  6. ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项

    前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...

  7. Asp.net core 学习笔记 ( Data protection )

    参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...

  8. Asp.net core 学习笔记 SignalR

    refer : https://kimsereyblog.blogspot.com/2018/07/signalr-with-asp-net-core.html https://github.com/ ...

  9. Asp.net core (学习笔记 路由和语言 route & language)

    https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...

随机推荐

  1. uml类图和er图中主外键的表示区别

    在er图也就是数据库中,无论是mysql/oracle都是从表引用主表的pk作为外键. 而在uml类图表示法中,他们的顺序则刚好相反,从主对象导向到子对象,如下: 主体是资金借款方,征信信息和资金借款 ...

  2. Android 4.4 根据uri获取路径的方法

    当我们选择图片以后,返回的是Uri,此时我们要把路径存储到数据库,必须将其转换成String类型. URI:  //content://com.android.providers.media.docu ...

  3. 2018-2019-1 20189206 《Linux内核原理与分析》第七周作业

    linux内核分析学习笔记 --第六章 进程的描述和进程的创建 学习重点--子进程的创建以及运行流程 进程描述和进程的创建 操作系统的三大功能--进程管理.内存管理和文件系统. 在linux内核中利用 ...

  4. 【TensorFlow】tf.nn.max_pool实现池化操作

    max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似 有些地方可以从卷积去参考[TensorFlow]tf.nn.conv2d是怎样实现卷积的? tf.nn.max_pool(va ...

  5. log4j2使用介绍

    工作中,用到了log4j2,以前只接触过log4j,也没有太过深入,这次就稍微系统的学习了以下log4j2. 一.引入pom.xml 使用maven作为项目的构建环境,pom.xml使用slf4j,s ...

  6. 02MySQL中的数据类型

    一.数值 INT DECIMAL 准确的小数值 FLOAT DOUBLE 二.字符串类型 CHAR(m) 此数据类型用于表示固定长度的字符串,可以包含最多达255个字符,其中m代表字符串的长度.长度固 ...

  7. 自动化测试系列:Selenium UI自动化解决iframe定位问题

      更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...

  8. git如何修改用户名和邮箱名?

    答: 使用git config --global --edit即可进行修改

  9. DownAlbum:Chrome的pinterest批量下载插件

    一.DownAlbum安装 二.DownAlbum使用 点击DownAlbum图标. 选择Normal. 会出现一个加载的弹窗,等待片刻会打开一个新的窗口. 按Ctrl+S,即可保存相册所有图片. 图 ...

  10. 基于OpenNetVM配置环境的发包实践

    参考: openNetVM 基于OpenNetVM配置环境的发包实践 注意:本文并未对OpenNetVM的服务链进行测试,而是在借助OpenNetVM脚本环境的情况下,分别对Pktgen和MoonGe ...