16 .net core http请求

本文介绍如何在.NET应用中使用IHttpClientFactory注册和配置HttpClient,实现更高效的HTTP请求处理。通过命名客户端和出站请求中间件,可以简化代码并提高请求的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例

系统必备

面向.NET Framework 的项目要求安装 Microsoft.Extensions.Http NuGet 包。
面向 .NET Core 且引用 Microsoft.AspNetCore.App 元包的项目已经包括 Microsoft.Extensions.Http 包。

基本用法

注册服务

services.AddHttpClient();

依赖注入

public class BasicUsageModel : PageModel {
    private readonly IHttpClientFactory _clientFactory;

	public IEnumerable<GitHubBranch> Branches { get; private set; }
	
	public bool GetBranchesError { get; private set; }
	
	    // 注入 IHttpClientFactory
	    public BasicUsageModel (IHttpClientFactory clientFactory) {
	        _clientFactory = clientFactory;
	}

    public async Task OnGet () {
        var request = new HttpRequestMessage (HttpMethod.Get, "https://api.github.com/repos/aspnet/docs/branches");
        request.Headers.Add ("Accept", "application/vnd.github.v3+json");
        request.Headers.Add ("User-Agent", "HttpClientFactory-Sample");

        // 生成 Http 客户端
        var client = _clientFactory.CreateClient ();
        // 发送请求
        var response = await client.SendAsync (request);

        if (response.IsSuccessStatusCode) {
            Branches = await response.Content.ReadAsAsync<IEnumerable<GitHubBranch>> ();
        } else {
            GetBranchesError = true;
            Branches = Array.Empty<GitHubBranch> ();
        }
    }
}

命名客户端

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

// 创建命名客户端
var client = _clientFactory.CreateClient("github");

出站请求中间件

要创建处理程序,请定义一个派生自 DelegatingHandler 的类。 重写 SendAsync 方法,在将请求传递至管道中的下一个处理程序之前执行代码

public class ValidateHeaderHandler : DelegatingHandler {
    protected override async Task<HttpResponseMessage> SendAsync (HttpRequestMessage request,
        CancellationToken cancellationToken) {
        if (!request.Headers.Contains ("X-API-KEY")) {
            return new HttpResponseMessage (HttpStatusCode.BadRequest) {
                Content = new StringContent ("You must supply an API key header called X-API-KEY")
            };
        }

        return await base.SendAsync (request, cancellationToken);
    }
}
services.AddTransient<ValidateHeaderHandler> ();

services.AddHttpClient ("externalservice", c => {
        c.BaseAddress = new Uri ("https://localhost:5000/"); // assume this is an "external" service which requires an API KEY
    })
    .AddHttpMessageHandler<ValidateHeaderHandler> ();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值