C# .net core HttpClientFactory用法及说明

 更新时间:2023年11月07日 14:20:45   作者:zxb11c  
这篇文章主要介绍了C# .net core HttpClientFactory用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.引入包

Microsoft.Extensions.Http

2.IOC注入

public void ConfigureServices(IServiceCollection services)
{
   services.AddHttpClient<IEmployeeService, 	  EmployeeService>(
                client => client.BaseAddress = new Uri("http://localhost:7000"));
            services.AddHttpClient<IDepartmentService, DepartmentService>(
                client => client.BaseAddress = new Uri("http://localhost:7000"));


    // 注入HttpClient
    services.AddHttpClient("client_1", config =>  //这里指定的name=client_1,可以方便我们后期服用该实例
    {
        config.BaseAddress = new Uri("http://www.baidu.com");
        config.DefaultRequestHeaders.Add("header_1", "header_1");
    });
    services.AddHttpClient("client_2", config =>
    {
        config.BaseAddress = new Uri("https://www.qq.com/");
        config.DefaultRequestHeaders.Add("header_2", "header_2");
    });
	
	

    services.AddHttpClient();

}

3.使用

 public class DemoController : ControllerBase
    {
        IHttpClientFactory _httpClientFactory;

        /// <summary>
        /// 通过构造函数实现注入
        /// </summary>
        /// <param name="httpClientFactory"></param>
        public DemoController(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }

        public async Task<string> Get()
        {
            var client = _httpClientFactory.CreateClient("client_1"); //复用在Startup中定义的client_1的httpclient
            var result = await client.GetStringAsync("/page1.html");

            var client2 = _httpClientFactory.CreateClient(); //新建一个HttpClient
            var result2 = await client.GetAsync("http://www.baidu.com");



            return result2.StatusCode.ToString();
        }
    }
public class EmployeeService: IEmployeeService
    {
        private readonly HttpClient _httpClient;

        public EmployeeService(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }

        public async Task<IEnumerable<EmployeeDto>> GetForDepartmentAsync(int departmentId)
        {
            return await JsonSerializer.DeserializeAsync<IEnumerable<EmployeeDto>>(
                await _httpClient.GetStreamAsync("api/department/1/employee"),
                new JsonSerializerOptions
                {
                    PropertyNameCaseInsensitive = true
                });
        }
}

4.HttpClient用法 get

  using var client = new HttpClient();
        var result = await client.GetAsync(url);

HEAD

  using var client = new HttpClient();
            var result = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, url));

post json

 var json = JsonConvert.SerializeObject(person);
            var data = new StringContent(json, Encoding.UTF8, "application/json");
            using (var client = new HttpClient()){
            //添加请求头
              client .DefaultRequestHeaders.Add("Authorization", "Bearer your_token");
        client .DefaultRequestHeaders.Add("User-Agent", "Your User Agent");

            var response = await client.PostAsync(url, data);
            string result = response.Content.ReadAsStringAsync().Result;
            }

post form

HttpContent postContent = new FormUrlEncodedContent(Dictionary);
	HttpResponseMessage response = await httpClient.PostAsync(requestUrl, postContent );
	response.EnsureSuccessStatusCode();
	responseBody = await response.Content.ReadAsStringAsync();

下载图片

 using var httpClient = new HttpClient();
            var url = "http://webcode.me/favicon.ico";
            byte[] imageBytes = await httpClient.GetByteArrayAsync(url);
            string documentsPath = System.Environment.GetFolderPath(
                    System.Environment.SpecialFolder.Personal);
            string localFilename = "favicon.ico";
            string localPath = Path.Combine(documentsPath, localFilename);
            File.WriteAllBytes(localPath, imageBytes);

post form-data上传文件

使用 HttpClient 发送 form-data 形式的请求来上传文件,可以按照以下步骤进行操作:

创建一个 HttpClient 实例:

HttpClient client = new HttpClient();

使用 MultipartFormDataContent 类创建一个 form-data 实例:

MultipartFormDataContent formData = new MultipartFormDataContent();

添加文件内容到 formData:

byte[] fileBytes = File.ReadAllBytes(filePath);
ByteArrayContent fileContent = new ByteArrayContent(fileBytes);
fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg");
formData.Add(fileContent, "file", "filename.ext");

这里的 “file” 是表单字段名,“filename.ext” 是上传文件的名称。

添加其他表单字段(可选):

formData.Add(new StringContent("value"), "field");

这里的 “field” 是表单字段名。

发送 POST 请求:

string url = "https://xxx.com/upload";
HttpResponseMessage response = await client.PostAsync(url, formData);

处理响应结果:

if (response.IsSuccessStatusCode)
{
    // 上传成功,处理逻辑
}
else
{
    // 处理错误情况
}
 public async Task UploadFile(string filePath)
    {
        using (HttpClient client = new HttpClient())
        {
            using (MultipartFormDataContent formData = new MultipartFormDataContent())
            {
                byte[] fileBytes = File.ReadAllBytes(filePath);
                ByteArrayContent fileContent = new ByteArrayContent(fileBytes);
                fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg");
                formData.Add(fileContent, "file", Path.GetFileName(filePath));

                // 添加其他表单字段
                formData.Add(new StringContent("value"), "field");

                string url = "https://example.com/upload";
                HttpResponseMessage response = await client.PostAsync(url, formData);

                if (response.IsSuccessStatusCode)
                {
                    // 上传成功,处理逻辑
                }
                else
                {
                    // 处理错误情况
                }
            }
        }
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C#.Net ArrayList的使用方法

    C#.Net ArrayList的使用方法

    这篇文章主要介绍了C#.Net ArrayList的使用方法,使用动态数组的优点是可以根据用户需要,有效利用存储空间,需要的朋友可以参考下
    2015-10-10
  • 深入浅析C# 11 对 ref 和 struct 的改进

    深入浅析C# 11 对 ref 和 struct 的改进

    这篇文章主要介绍了C# 11 对 ref 和 struct 的改进,有了这些基础设施,开发者们将能轻松使用安全的方式来编写没有任何堆内存开销的高性能代码,需要的朋友可以参考下
    2022-04-04
  • C# HttpClient超时重试机制详解

    C# HttpClient超时重试机制详解

    超时重试的实现方式可以使用循环结构,在请求发起后等待一定时间,若超时未收到响应,则再次发起请求,循环次数可以根据实际情况进行设置,一般建议不超过三次,这篇文章主要介绍了C# HttpClient超时重试,需要的朋友可以参考下
    2023-06-06
  • C#安装OpenCvSharp4的实现步骤

    C#安装OpenCvSharp4的实现步骤

    OpenCv是一款开源的图像处理库,本文就介绍了C#安装OpenCvSharp4的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2022-05-05
  • 实例讲解C#中的职责链模式

    实例讲解C#中的职责链模式

    这篇文章主要介绍了C#中的职责链模式的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#条码生成类分享

    C#条码生成类分享

    这篇文章主要分享了C#条码生成类的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#中ftp检测目录是否存在和创建文件夹的实现

    C#中ftp检测目录是否存在和创建文件夹的实现

    本文主要介绍了C#中ftp检测目录是否存在和创建文件夹的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C#线程同步的三类情景分析

    C#线程同步的三类情景分析

    这篇文章主要介绍了C#线程同步的三类情景分析,较为详细生动的讲述了C#线程同步的三类情况,让大家对C#多线程程序设计有一个深入的了解,需要的朋友可以参考下
    2014-10-10
  • C#实现获取Excel中图片所在坐标位置

    C#实现获取Excel中图片所在坐标位置

    本文以C#和vb.net代码示例展示如何来获取Excel工作表中图片的坐标位置,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-04-04
  • C#数据结构之循环链表的实例代码

    C#数据结构之循环链表的实例代码

    C#数据结构之循环链表的实例代码,需要的朋友可以参考一下
    2013-03-03

最新评论