C# Winform中使用 IHttpClientFactory的步骤介绍

C# Winform中使用IHttpClientFactory与HttpClientFactory的步骤介绍六种方法:

HttpClientFactory是ASP.NET Core 2.1中引入的一个新特性,它可以帮助我们管理HttpClient实例。在Winform应用程序中,我们也可以使用 IHttpClientFactory来管理HttpClient实例。

在winform项目中添加以下NuGet包:

  • Microsoft.Extensions.Http
  • Microsoft.Extensions.DependencyInjection

 上面安装Microsoft.Extensions.Http的NuGet包会连Microsoft.Extensions.DependencyInjectionNuGet包一起安装。

微软使用 .NET 的 IHttpClientFactory介绍https://learn.microsoft.com/zh-cn/dotnet/core/extensions/httpclient-factory

在C#中,IHttpClientFactory和HttpClientFactory关系、作用介绍

在C#中,IHttpClientFactory和HttpClientFactory是用于创建和管理HttpClient实例的工厂类。HttpClient是用于发送HTTP请求的类,它可以在应用程序中被多次使用。然而,每次使用HttpClient时,都需要手动创建和配置它,这可能会导致代码重复和性能问题。

为了解决这个问题,Microsoft在ASP.NET Core 2.1中引入了IHttpClientFactory和HttpClientFactory。IHttpClientFactory是一个接口,它定义了创建和管理HttpClient实例的方法。HttpClientFactory是IHttpClientFactory接口的默认实现,它提供了一些默认的配置选项,例如连接池大小、超时时间等。

使用IHttpClientFactory和HttpClientFactory可以带来以下好处:

  1. 代码重用:通过使用IHttpClientFactory和HttpClientFactory,可以避免在应用程序中手动创建和配置HttpClient实例的重复代码。

  2. 性能优化:HttpClientFactory使用连接池来管理HttpClient实例,这可以减少创建和销毁HttpClient实例的开销,并提高应用程序的性能。

  3. 配置灵活:通过配置IHttpClientFactory和HttpClientFactory,可以轻松地更改HttpClient实例的行为,例如超时时间、代理设置等。

下面是一个使用IHttpClientFactory和HttpClientFactory的示例:

扫描二维码关注公众号,回复: 15915071 查看本文章
public class MyController : Controller
{
    private readonly IHttpClientFactory _httpClientFactory;

    public MyController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    public async Task<IActionResult> Index()
    {
        var client = _httpClientFactory.CreateClient();
        var response = await client.GetAsync("https://www.example.com");
        var content = await response.Content.ReadAsStringAsync();
        return Content(content);
    }
}

在上面的示例中,我们注入了IHttpClientFactory接口,并在Index方法中使用它来创建HttpClient实例。HttpClientFactory会自动管理HttpClient实例的生命周期,并使用连接池来提高性能。

总之,IHttpClientFactory和HttpClientFactory是用于创建和管理HttpClient实例的工厂类,它们可以帮助我们避免重复代码、提高性能并提供灵活的配置选项。             

                             第一种方法

步骤1:添加NuGet包

首先,需要在项目中添加Microsoft.Extensions.Http NuGet包。可以通过NuGet包管理器或通过Package Manager Console来添加。

步骤2:创建HttpClient实例

接下来,需要在代码中创建HttpClient实例。可以使用HttpClientFactory来创建HttpClient实例,这样可以避免在代码中直接创建HttpClient实例所带来的一些问题。

using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;

// 在program.cs程序入口处添加以下代码
var services = new ServiceCollection();
services.AddHttpClient();
var serviceProvider = services.BuildServiceProvider();
var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
var httpClient = httpClientFactory.CreateClient();

步骤3:使用HttpClient实例

现在,可以使用HttpClient实例来发送HTTP请求了。以下是一个简单的示例:

var response = await httpClient.GetAsync("https://www.example.com");
var content = await response.Content.ReadAsStringAsync();

这样,就可以在Winform中使用HttpClientFactory了。

                                       第二种方法

在Winform中使用HttpClientFactory发送HTTP请求可以提高代码的可读性和可维护性。下面是使用HttpClientFactory的步骤:

  1. 在项目中添加Microsoft.Extensions.Http NuGet包。

  2. 在代码中创建HttpClientFactory实例。

using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;

// 在构造函数中创建HttpClientFactory实例
public class MyForm : Form
{
    private readonly IHttpClientFactory _httpClientFactory;

    public MyForm()
    {
        var services = new ServiceCollection();
        services.AddHttpClient();
        var serviceProvider = services.BuildServiceProvider();
        _httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
    }
}

3、使用HttpClientFactory实例创建HttpClient实例。

// 在需要发送HTTP请求的方法中创建HttpClient实例
private async Task<string> SendHttpRequestAsync()
{
    var httpClient = _httpClientFactory.CreateClient();
    var response = await httpClient.GetAsync("https://example.com");
    return await response.Content.ReadAsStringAsync();
}

 添加proxy代理与user-Agent。使用HttpClientHandler类来设置代理服务器,然后将HttpClientHandler实例传递给HttpClient的构造函数。

private readonly IHttpClientFactory _httpClientFactory;

public Form1()
{
    InitializeComponent();

    var services = new ServiceCollection();
    services.AddHttpClient();
    var serviceProvider = services.BuildServiceProvider();
    _httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
}

async Task<string> DownloadWebsiteAsync(string site)
{
    var httpClient = _httpClientFactory.CreateClient();
    var proxies = new List<string> { "http://proxy1:port", "http://proxy2:port", "http://proxy3:port" };
    var userAgents = new List<string> { "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299" };
    var random = new Random();
    var proxyIndex = random.Next(proxies.Count);
    var userAgentIndex = random.Next(userAgents.Count);

    var handler = new HttpClientHandler
    {
        Proxy = new WebProxy(proxies[proxyIndex]),
        UseProxy = true
    };
    httpClient = new HttpClient(handler);
    httpClient.DefaultRequestHeaders.Add("User-Agent", userAgents[userAgentIndex]);

    var response = await httpClient.GetAsync(site).ConfigureAwait(false);
    var responseStream = await response.Content.ReadAsStreamAsync();
    var streamReader = new StreamReader(responseStream, Encoding.Default);
    return await streamReader.ReadToEndAsync();
}

第三种方法

首先,我们需要在Winform应用程序中安装Microsoft.Extensions.Http包。可以通过NuGet包管理器或者命令行来安装:

Install-Package Microsoft.Extensions.Http
安装完成后,我们需要在应用程序启动时配置HttpClientFactory。可以在Program.cs文件中的Main方法中添加以下代码:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    var services = new ServiceCollection();
    services.AddHttpClient();

    var serviceProvider = services.BuildServiceProvider();
    var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();

    Application.Run(new Form1(httpClientFactory));
}

在上面的代码中,我们首先创建了一个ServiceCollection对象,然后调用AddHttpClient方法来注册HttpClientFactory服务。接着,我们通过BuildServiceProvider方法来构建ServiceProvider对象,并通过GetService方法来获取IHttpClientFactory服务。最后,我们将httpClientFactory对象传递给Form1窗体。

在Form1窗体中,我们可以通过构造函数来接收httpClientFactory对象,并使用它来创建HttpClient实例。以下是一个示例:

public partial class Form1 : Form
{
    private readonly IHttpClientFactory _httpClientFactory;

    public Form1(IHttpClientFactory httpClientFactory)
    {
        InitializeComponent();

        _httpClientFactory = httpClientFactory;
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        var httpClient = _httpClientFactory.CreateClient();

        var response = await httpClient.GetAsync("https://www.example.com");

        var content = await response.Content.ReadAsStringAsync();

        textBox1.Text = content;
    }
}

在上面的代码中,我们首先在构造函数中接收httpClientFactory对象,并将其保存在私有字段中。然后,在button1_Click事件处理程序中,我们使用httpClientFactory对象来创建HttpClient实例,并使用它来发送GET请求。最后,我们将响应内容显示在textBox1控件中。

通过使用HttpClientFactory来管理HttpClient实例,我们可以避免资源浪费和性能下降的问题。此外,HttpClientFactory还提供了一些其他的功能,例如自定义HttpClient实例的配置和管理多个HttpClient实例等。因此,在Winform应用程序中使用HttpClientFactory是一个不错的选择。

第四种方法

 在winform项目的Program.cs文件中添加以下代码:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;

namespace WinFormApp
{
    static class Program
    {
        [STAThread]
        static async Task Main()
        {
            var builder = new HostBuilder()
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHttpClient();
                });

            var host = builder.Build();

            using (var serviceScope = host.Services.CreateScope())
            {
                var services = serviceScope.ServiceProvider;
                var httpClientFactory = services.GetRequiredService<IHttpClientFactory>();

                // 在这里使用httpClientFactory
            }
        }
    }
}

在winform项目中使用_httpClientFactory_时,需要使用以下代码:

var httpClientFactory = services.GetRequiredService<IHttpClientFactory>();
var httpClient = httpClientFactory.CreateClient();

完整使用代码

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormApp
{
    public partial class Form1 : Form
    {
        private readonly IHttpClientFactory _httpClientFactory;

        public Form1(IHttpClientFactory httpClientFactory)
        {
            InitializeComponent();
            _httpClientFactory = httpClientFactory;
        }
        private async void button1_Click(object sender, EventArgs e)
        {
            //这里省略很多代码...............
            DownloadWebsiteAsync(url)
           
        }
        private async Task<string> DownloadWebsiteAsync(string url)
        {
            var httpClient = _httpClientFactory.CreateClient();
            var response = await httpClient.GetAsync(site).ConfigureAwait(false);
            var responseStream = await response.Content.ReadAsStreamAsync();
            var streamReader = new StreamReader(responseStream, Encoding.Default);
            return await streamReader.ReadToEndAsync();
        }
    }
}

第五种方法

步骤1:安装Microsoft.Extensions.Http包

在Visual Studio中打开Winform应用程序的项目,右键单击项目名称,选择“管理NuGet程序包”。在NuGet程序包管理器中搜索“Microsoft.Extensions.Http”,然后安装该包。

步骤2:在Startup.cs文件中配置HttpClientFactory

在Winform应用程序中,我们需要手动配置HttpClientFactory。在项目中添加一个名为“Startup.cs”的文件,并添加以下代码:

using Microsoft.Extensions.DependencyInjection;
using System.Net.Http;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpClient();
    }
}

步骤3:在Winform窗体中使用HttpClientFactory

在Winform窗体中,我们可以使用HttpClientFactory来创建HttpClient实例。以下是一个简单的示例:

using Microsoft.Extensions.DependencyInjection;
using System.Net.Http;

public partial class Form1 : Form
{
    private readonly IHttpClientFactory _httpClientFactory;

    public Form1(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
        InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        var client = _httpClientFactory.CreateClient();
        var response = await client.GetAsync("https://jsonplaceholder.typicode.com/todos/1");
        var content = await response.Content.ReadAsStringAsync();
        textBox1.Text = content;
    }
}

 在上面的示例中,我们注入了IHttpClientFactory接口,并在构造函数中将其赋值给了一个私有字段。在button1_Click事件处理程序中,我们使用HttpClientFactory创建了一个HttpClient实例,并使用它发送了一个HTTP GET请求。

或者

步骤1:安装Microsoft.Extensions.Http包

在Visual Studio中打开NuGet包管理器控制台,运行以下命令:

Install-Package Microsoft.Extensions.Http

步骤2:在Startup.cs中配置HttpClientFactory

在Winform应用程序中,没有Startup.cs文件,我们需要手动创建一个。在项目中添加一个新的类文件,命名为Startup.cs,并将以下代码添加到其中:

using Microsoft.Extensions.DependencyInjection;
using System.Net.Http;

namespace WinformHttpClientFactoryDemo
{
    public static class Startup
    {
        public static void ConfigureServices(IServiceCollection services)
        {
            services.AddHttpClient();
        }
    }
}

步骤3:在Main方法中调用ConfigureServices方法

在Winform应用程序的Main方法中,调用ConfigureServices方法来配置HttpClientFactory:

using Microsoft.Extensions.DependencyInjection;
using System.Net.Http;

public partial class Form1 : Form
{
    private readonly IHttpClientFactory _httpClientFactory;

    public Form1(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
        InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        var client = _httpClientFactory.CreateClient();
        var response = await client.GetAsync("https://jsonplaceholder.typicode.com/todos/1");
        var content = await response.Content.ReadAsStringAsync();
        textBox1.Text = content;
    }
}

第六种方法

步骤

  1. 在Winform应用程序中,打开NuGet包管理器,并搜索Microsoft.Extensions.Http。安装此包。

  2. 在应用程序的启动代码中,添加以下代码:

IServiceCollection services = new ServiceCollection();
services.AddHttpClient();

这将向应用程序添加HttpClientFactory服务。

3、在需要发送HTTP请求的代码中,注入IHttpClientFactory服务,并使用它来创建HttpClient实例。以下是一个示例:

public class MyService
{
    private readonly IHttpClientFactory _httpClientFactory;

    public MyService(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    public async Task<string> GetSomeData()
    {
        var client = _httpClientFactory.CreateClient();
        var response = await client.GetAsync("https://example.com");
        return await response.Content.ReadAsStringAsync();
    }
}

 在上面的示例中,我们注入了IHttpClientFactory服务,并在GetSomeData方法中使用它来创建HttpClient实例。我们可以使用HttpClient实例来发送HTTP请求。

完整代码示例

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;

namespace MyWinformApp
{
    public partial class Form1 : Form
    {
        private readonly MyService _myService;

        public Form1()
        {
            InitializeComponent();

            IServiceCollection services = new ServiceCollection();
            services.AddHttpClient();

            var serviceProvider = services.BuildServiceProvider();
            _myService = serviceProvider.GetService<MyService>();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            var data = await _myService.GetSomeData();
            MessageBox.Show(data);
        }
    }

    public class MyService
    {
        private readonly IHttpClientFactory _httpClientFactory;

        public MyService(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }

        public async Task<string> GetSomeData()
        {
            var client = _httpClientFactory.CreateClient();
            var response = await client.GetAsync("https://example.com");
            return await response.Content.ReadAsStringAsync();
        }
    }
}

在上面的代码示例中,我们创建了一个Winform应用程序,并在应用程序的启动代码中添加了HttpClientFactory服务。我们还创建了一个MyService类,它使用IHttpClientFactory服务来发送HTTP请求。在Winform应用程序的按钮单击事件中,我们使用MyService类来获取一些数据,并在消息框中显示它。

HttpClientFactory介绍

HttpClientFactory是ASP.NET Core 2.1中的一个新功能,它提供了一种更好的方式来管理HttpClient实例。在以前的版本中,我们需要手动创建和管理HttpClient实例,这可能会导致一些问题,例如内存泄漏和性能问题。HttpClientFactory通过提供一个中心化的HttpClient实例管理器来解决这些问题。

HttpClientFactory的主要作用是提供一个HttpClient实例的工厂,这个工厂可以被注入到应用程序中的其他组件中。这个工厂可以管理HttpClient实例的生命周期,并提供一些额外的功能,例如自动重试、负载均衡和熔断器。

使用HttpClientFactory的好处是它可以帮助我们更好地管理HttpClient实例,从而提高应用程序的性能和可靠性。它还可以减少代码中的重复代码,并提供一些额外的功能,例如自动重试和熔断器。

如果你正在使用ASP.NET Core 2.1或更高版本,我建议你尝试使用HttpClientFactory来管理你的HttpClient实例。

 IHttpClientFactory对比HttpClient介绍

在C#中,HttpClient是一个常用的类,用于发送HTTP请求。但是,随着应用程序的复杂性增加,使用HttpClient可能会导致一些问题,例如性能问题和资源泄漏。因此,微软推出了HttpClientFactory,以解决这些问题。那么,HttpClientFactory和HttpClient有什么区别呢?

HttpClientFactory是一个工厂类,用于创建和管理HttpClient实例。它提供了一些优点,例如:

  • 性能:HttpClientFactory可以重用HttpClient实例,从而减少了创建和销毁实例的开销。
  • 可配置性:HttpClientFactory可以配置HttpClient实例的行为,例如超时时间、重试策略和消息处理程序。
  • 生命周期管理:HttpClientFactory可以管理HttpClient实例的生命周期,从而避免了资源泄漏问题。

相比之下,使用HttpClient可能会导致一些问题,例如:

  • 性能:每次发送HTTP请求时,都需要创建和销毁HttpClient实例,这可能会导致性能问题。
  • 可配置性:HttpClient实例的行为通常是硬编码的,这意味着它们很难在运行时进行更改。
  • 生命周期管理:HttpClient实例的生命周期通常是由开发人员手动管理的,这可能会导致资源泄漏问题。

下面是一个使用HttpClientFactory的示例:

public class MyController : Controller
{
    private readonly IHttpClientFactory _httpClientFactory;

    public MyController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    public async Task<IActionResult> Index()
    {
        var client = _httpClientFactory.CreateClient();
        var response = await client.GetAsync("https://www.example.com");
        var content = await response.Content.ReadAsStringAsync();
        return Content(content);
    }
}

在这个示例中,我们注入了IHttpClientFactory接口,并使用它来创建HttpClient实例。这个示例中的HttpClient实例是由HttpClientFactory管理的,因此我们不需要手动管理它的生命周期。此外,我们可以在HttpClientFactory中配置HttpClient实例的行为,例如超时时间和重试策略。

总之,HttpClientFactory是一个更好的选择,因为它提供了更好的性能、可配置性和生命周期管理。如果您正在使用HttpClient,请考虑迁移到HttpClientFactory。

技术来源于思想自由、独立思考、辩证分析、逻辑思维与人类自由的创新,来服务于人类生活各种方便,而不是为了用技术打造思想鸿沟围城来制造愚蠢;技术是好的与坏的,好人用技术是更好的,坏人用技术是更坏的。推荐好书:乔治.奥威尔的《1984》,有多个译本,选择喜欢的译本就行了;还有柏拉图的《理想国》、哈耶克《通向奴役之路》(港版)(港版翻译较好大陆版本,英语过硬的最好看英文原版),现在网店都有售卖!阅读好书,阅读大部分人未阅读过与课堂没有的书,阅读这片土地没有的知识就能增加一种思辨思维与智慧,才能走出狭隘思维偏见的洞穴!

柏拉图在他的巨著《理想国》的第七卷里写到了洞穴理论阐明:一群从小被囚禁生活在洞穴里人,在洞穴外面的光线照明下,往内看是一片片黑影,往外看是光明的海阔天空,越看越明亮!

包容的人更自信思维更多元,包容好的使人更强大。

欢迎大家补充!

猜你喜欢

转载自blog.csdn.net/m0_58015531/article/details/131015681
今日推荐