当前位置: 首页 > news >正文

python做动态网站/黄石seo诊断

python做动态网站,黄石seo诊断,wordpress 建立相册,网站 加域名(给DotNet加星标,提升.Net技能)转自:暗断肠cnblogs.com/wzk153/p/10945313.html一、HttpClient类使用存在的问题HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解&#…

(给DotNet加星标,提升.Net技能)

转自:暗断肠cnblogs.com/wzk153/p/10945313.html

一、HttpClient类使用存在的问题

HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使用存在的问题,下面让我们通过代码跟示例来描述。

using(var client = new HttpClient())

传统关闭连接方法如上述代码所示,但当使用using语句释放HttpClient对象的时候,套接字(socket)也不会立即释放,下面我们通过请求aspnetmonsters站点的示例来验证下:

class Program
{
static void Main(string[] args){
Console.WriteLine("Starting connections");
var g = GetAsync();
g.Wait();
Console.WriteLine("Connections done");
Console.ReadKey();
}
static async Task GetAsync(){
for (int i = 0; i < 5; i++)
{
using (var client = new HttpClient())
{
var result = await client.GetAsync("http://aspnetmonsters.com/");
Console.WriteLine(result.StatusCode);
}
}
}
}

输出结果:

b941bad8e137d7c8efc8c18e861817b6.png

控制台打印出五条请求站点返回状态的信息,下面我们通过netstat工具打印出五个请求连接套接字状态:

fdecfa9ccfbd7afe9a9d1d0cb419375c.png

应用程序已经运行结束了(结束连接),但是打印结果显示连接状态仍然是TIME_WAIT,也就是说在此状态期间仍然在观察是否有数据包进入连接(如果连接等待中有任何数据包仍然会通过),因为它们可能在某个地方被网络延迟,这是我从tcpstate窃取的TCP / IP状态图。

95fc151a3ca51e0e24d42a130a09ff22.png

Windows将在此状态下保持连接240秒(由其设置[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay])。Windows可以快速打开新套接字的速度有限,因此如果您耗尽连接池,那么您可能会看到如下错误:

1a20f117c84a2ffac6a5924aaf9f8e0e.png

而怎么做才可以减少套接字的浪费呢?我们在上述代码中把每次循环中创建的HttpClient对象拉到Main外定义为一个共享的静态实例:

class Program
{
private static HttpClient client = new HttpClient();
static void Main(string[] args){
Console.WriteLine("Starting connections");
var g = GetAsync();
g.Wait();
Console.WriteLine("Connections done");
Console.ReadKey();
}
static async Task GetAsync(){
for (int i = 0; i < 5; i++)
{
var result = await client.GetAsync("http://aspnetmonsters.com/");
Console.WriteLine(result.StatusCode);
}
}
}

应用程序运动完毕之后,我们再通过netstat工具打印出五个请求连接套接字状态,这时候会看到信息如下:

bc43f4509aa7c0541b5ca0af804cb782.png

通过共享一个实例,减少了套接字的浪费,实际上由于套接字重用而传输快一点。

总结:

  • 在创建HttpClient实例的时候,最好是静态(static )实例。

  • 不要用using包装HttpClient对象。

在.NET Core 2.1版本之后引入的 HttpClientFactory解决了HttpClient的所有痛点。有了 HttpClientFactory,我们不需要关心如何创建HttpClient,又如何释放它。

通过它可以创建具有特定业务的HttpClient,而且可以很友好的和 DI 容器结合使用,更为灵活。下面以 ASP.NET Core为例介绍HttpClientFactory的四种使用方式。

二、HttpClientFactory 的多种使用方式

可以通过多种使用方式在应用程序中使用HttpClientFactory。

2.1、直接使用HttpClientFactory

在Startup.ConfigureServices方法中,通过在IServiceCollection上调用AddHttpClient扩展方法可以注册IHttpClientFactory服务。

services.AddHttpClient();

注册服务后,我们新建BasicUsageModel类使用IHttpClientFactory创建HttpClient实例:

public class BasicUsageModel
{
private readonly IHttpClientFactory _clientFactory;
public IEnumerable Branches { get; private set; }public bool GetBranchesError { get; private set; }public BasicUsageModel(IHttpClientFactory clientFactory){
_clientFactory = clientFactory;
}public async Task OnGet(){var request = new HttpRequestMessage(HttpMethod.Get, "https://api.github.com/repos/aspnet/AspNetCore.Docs/branches");
request.Headers.Add("Accept", "application/vnd.github.v3+json");
request.Headers.Add("User-Agent", "HttpClientFactory-Sample");var client = _clientFactory.CreateClient();var response = await client.SendAsync(request);if (response.IsSuccessStatusCode)
{
Branches = await response.Content
.ReadAsAsync>();
}else
{
GetBranchesError = true;
Branches = Array.Empty();
}
}
}public class GitHubBranch
{public string name { get; set; }
}

以这种方式直接在使用IHttpClientFactory的类中调用CreateClient方法创建HttpClient实例。然后在Controller中调用BasicUsageModel类:

public class HomeController : Controller
{
private readonly IHttpClientFactory _clientFactory;
public HomeController(IHttpClientFactory clientFactory){
_clientFactory = clientFactory;
}
public IActionResult Index(){
BasicUsageModel model = new BasicUsageModel(_clientFactory);
var task = model.OnGet();
task.Wait();
List list = model.Branches.ToList();return View(list);
}
}

2.2、使用命名客户端

如果应用程序需要有许多不同的HttpClient用法(每种用法的服务配置都不同),可以视情况使用命名客户端。

可以在HttpClient中注册时指定命名Startup.ConfigureServices的配置。

services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("https://api.github.com/");
// Github API versioning
c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
// Github requires a user-agent
c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});

上面的代码调用AddHttpClient,同时提供名称“github”。此客户端应用了一些默认配置,也就是需要基址和两个标头来使用GitHub API。

每次调用CreateClient时,都会创建HttpClient 的新实例,并调用配置操作。

要使用命名客户端,可将字符串参数传递到CreateClient。指定要创建的客户端的名称:

public class NamedClientModel : PageModel
{
private readonly IHttpClientFactory _clientFactory;
public IEnumerable PullRequests { get; private set; }public bool GetPullRequestsError { get; private set; }public bool HasPullRequests => PullRequests.Any();public NamedClientModel(IHttpClientFactory clientFactory){
_clientFactory = clientFactory;
}public async Task OnGet(){var request = new HttpRequestMessage(HttpMethod.Get,"repos/aspnet/AspNetCore.Docs/pulls");var client = _clientFactory.CreateClient("github");var response = await client.SendAsync(request);if (response.IsSuccessStatusCode)
{
PullRequests = await response.Content
.ReadAsAsync>();
}else
{
GetPullRequestsError = true;
PullRequests = Array.Empty();
}
}
}public class GitHubPullRequest
{public string url { get; set; }public int? id { get; set; }public string node_id { get; set; }
}

在上述代码中,请求不需要指定主机名。可以仅传递路径,因为采用了为客户端配置的基址。在Controller中调用方法如上个示例。

2.3、使用类型化客户端

什么是“类型化客户端”?它只是DefaultHttpClientFactory注入时配置的HttpClient。

下图显示了如何将类型化客户端与HttpClientFactory结合使用:

ed8b92e77f05895b3a8654921ace528a.png

类型化客户端提供与命名客户端一样的功能,不需要将字符串用作密钥。它们提供单个地址来配置特定HttpClient并与其进行交互。例如,单个类型化客户端可能用于单个后端终结点,并封装此终结点的所有处理逻辑。另一个优势是它们使用 DI 且可以被注入到应用中需要的位置。

类型化客户端在构造函数中接收HttpClient参数:

public class GitHubService
{
public HttpClient Client { get; }
public GitHubService(HttpClient client){
client.BaseAddress = new Uri("https://api.github.com/");
// GitHub API versioning
client.DefaultRequestHeaders.Add("Accept",
"application/vnd.github.v3+json");
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent",
"HttpClientFactory-Sample");
Client = client;
}
public async Task> GetAspNetDocsIssues()
{var response = await Client.GetAsync("/repos/aspnet/AspNetCore.Docs/issues?state=open&sort=created&direction=desc");
response.EnsureSuccessStatusCode();var result = await response.Content
.ReadAsAsync>();return result;
}
}public class GitHubIssue
{public string url { get; set; }public int? id { get; set; }public string node_id { get; set; }
}

在上述代码中,配置转移到了类型化客户端中。HttpClient对象公开为公共属性。可以定义公开HttpClient功能的特定于API的方法。

GetAspNetDocsIssues方法从GitHub存储库封装查询和分析最新待解决问题所需的代码。

要注册类型化客户端,可在Startup.ConfigureServices中使用通用的AddHttpClient扩展方法,指定类型化客户端类:

services.AddHttpClient<GitHubService>();

使用DI将类型客户端注册为暂时客户端。可以直接插入或使用类型化客户端:

public class TypedClientModel : PageModel
{
private readonly GitHubService _gitHubService;
public IEnumerable LatestIssues { get; private set; }public bool HasIssue => LatestIssues.Any();public bool GetIssuesError { get; private set; }public TypedClientModel(GitHubService gitHubService){
_gitHubService = gitHubService;
}public async Task OnGet(){try
{
LatestIssues = await _gitHubService.GetAspNetDocsIssues();
}catch (HttpRequestException)
{
GetIssuesError = true;
LatestIssues = Array.Empty();
}
}
}

推荐阅读

(点击标题可跳转阅读)

.NET Core3.0 WebAPI 集成 Swagger 5.0

.NET Core 微服务权限系统

.NET Core 微服务工作流

看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

4581c9e50e021a50ae7cbdb3f7e9b864.png

好文章,我在看❤️

http://www.jmfq.cn/news/5060071.html

相关文章:

  • 网站开发不用jsp/搜索引擎营销的特点是
  • 想找一个网站做安全测试/谷歌浏览器网页版
  • 做网站挣钱经历/网站建设
  • 响应式网站新闻部分怎么做/石家庄网络关键词排名
  • 获取网站域名/给公司做网站要多少钱
  • 技术先进的网站建设公司/武汉网络推广有限公司
  • 内容营销的核心/深圳网站营销seo电话
  • wordpress门户站/百度主页网址
  • 女生做网站前端设计师/成都网站建设seo
  • 1369免费版街景地图/seo优化技术
  • 动态网站开发流程是什么/免费网页制作网站
  • 自己做网站的流程下载/seo服务外包费用
  • 可以做家教的网站有哪些/外贸网站推广方法之一
  • l临沂建设工程信息网站/竞价推广网络推广运营
  • 网站建设的费用结构/百度app安装下载
  • vs做网站好不好/百度广告推广电话
  • 陕西省交通建设集团西长分公司网站/香港域名注册网站
  • 网站做批发文具/网站关键词seo费用
  • 集团门户网站建设/苏州seo关键词优化价格
  • 单位如何做网站宣传/外链网站
  • 做米业的企业网站/百度指数数据分析报告
  • 在线制作flash的网站/网上国网推广
  • 接项目做的网站/做个公司网站一般需要多少钱
  • 周口师范做网站/营销策划咨询
  • 建设网络道德教育网站不包括/免费网站推广群发软件
  • 请人代做谷歌外贸网站/百度网址大全电脑版旧版本
  • 上海网站开发定制/深圳关键词优化
  • 做nba直播网站好/汕头网站建设方案优化
  • 机械网站模板/品牌策划公司介绍
  • 推荐一些能打开的网站/新闻稿发布平台