日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

起因

在項目中需要訪問Http請求的時候,通常都是使用WebRequest,主要是老項目(你懂得).如果不是老項目,應該使用HttpClient,但在.Net Core 2.1之后,官方可推薦使用使用HttpClientFactory.

1. HttpClient的使用

public static async void UseHttp()
{
    //在項目中HttpClient要靜態單實例
    //這里只是為了方便
    HttpClient httpClient = new HttpClient(); 
    httpClient.BaseAddress = new Uri("http://localhost:5000"); //要訪問的基地址,ip加端口

    string result = await httpClient.GetStringAsync("/Home/GethtmlData");
    Console.WriteLine(result);
}

2.在Asp.Net Core使用HttpClientFactory

在Startup文件的ConfigureServices函數,注冊HttpClient中間件

//1.在容器中注冊HttpClient中間件
services.AddHttpClient("baidu", client =>
{
    client.BaseAddress = new Uri("http://localhost:5000");  
    //還可以請求定制化
});
/// <summary>
/// 在控制器中的構造函數注入IHttpClientFactory
/// </summary>
/// <param name="logger">日志</param>
/// <param name="cache">緩存</param>
/// <param name="httpClientFactory">容器在實例化HomeController的時候,會先實現IHttpClientFactory的實現DefaultHttpClientFactory(AddHttpClient在容器中注冊)</param>
public HomeController(ILogger<HomeController> logger,
                        IMemoryCache cache,
                        IHttpClientFactory httpClientFactory)
{
    Console.WriteLine("有參數構造 HomeController");
    this._logger = logger;
    this._httpClientFactory = httpClientFactory;
}
/// <summary>
/// 在Action中使用HttpClient請求
/// </summary>
/// <returns></returns>
public async Task<string> GetHtmlData()
{
    //通過DefaultHttpClientFactory的CreateClient獲取HttpClient實例
    var client = _httpClientFactory.CreateClient("baidu");
    return await client.GetStringAsync("/");
}

在Asp.Net Core的HttpClient中間件源碼

Asp.Net Core 5源碼(2022.03.15,剛剛對比最新的代碼,好像變化不大):


public static IServiceCollection AddHttpClient(this IServiceCollection services)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    services.AddLogging();
    services.AddOptions();

    //
    // 向容器添加DefaultHttpClientFactory實例
    //
    services.TryAddTransient<HttpMessageHandlerBuilder, DefaultHttpMessageHandlerBuilder>();
    services.TryAddSingleton<DefaultHttpClientFactory>();
    services.TryAddSingleton<IHttpClientFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultHttpClientFactory>());
    services.TryAddSingleton<IHttpMessageHandlerFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultHttpClientFactory>());

    //
    // Typed Clients
    //
    services.TryAdd(ServiceDescriptor.Transient(typeof(ITypedHttpClientFactory<>), typeof(DefaultTypedHttpClientFactory<>)));
    services.TryAdd(ServiceDescriptor.Singleton(typeof(DefaultTypedHttpClientFactory<>.Cache), typeof(DefaultTypedHttpClientFactory<>.Cache)));

    //
    // Misc infrastructure
    //
    services.TryAddEnumerable(ServiceDescriptor.Singleton<IHttpMessageHandlerBuilderFilter, LoggingHttpMessageHandlerBuilderFilter>());

    // This is used to track state and report errors **DURING** service registration. This has to be an instance
    // because we access it by reaching into the service collection.
    services.TryAddSingleton(new HttpClientMAppingRegistry());

    // Register default client as HttpClient
    services.TryAddTransient(s =>
    {
        return s.GetRequiredService<IHttpClientFactory>().CreateClient(string.Empty);
    });

    return services;
}

public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    AddHttpClient(services);

    return new DefaultHttpClientBuilder(services, name);
}

public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name, Action<HttpClient> configureClient)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    if (configureClient == null)
    {
        throw new ArgumentNullException(nameof(configureClient));
    }

    AddHttpClient(services);

    var builder = new DefaultHttpClientBuilder(services, name);
    builder.ConfigureHttpClient(configureClient);
    return builder;
}

public static IServiceCollection AddHttpClient(this IServiceCollection services)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    services.AddLogging();
    services.AddOptions();

    //
    // Core abstractions
    //
    services.TryAddTransient<HttpMessageHandlerBuilder, DefaultHttpMessageHandlerBuilder>();
    services.TryAddSingleton<DefaultHttpClientFactory>();
    services.TryAddSingleton<IHttpClientFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultHttpClientFactory>());
    services.TryAddSingleton<IHttpMessageHandlerFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultHttpClientFactory>());

    //
    // Typed Clients
    //
    services.TryAdd(ServiceDescriptor.Transient(typeof(ITypedHttpClientFactory<>), typeof(DefaultTypedHttpClientFactory<>)));
    services.TryAdd(ServiceDescriptor.Singleton(typeof(DefaultTypedHttpClientFactory<>.Cache), typeof(DefaultTypedHttpClientFactory<>.Cache)));

    //
    // Misc infrastructure
    //
    services.TryAddEnumerable(ServiceDescriptor.Singleton<IHttpMessageHandlerBuilderFilter, LoggingHttpMessageHandlerBuilderFilter>());

    // This is used to track state and report errors **DURING** service registration. This has to be an instance
    // because we access it by reaching into the service collection.
    services.TryAddSingleton(new HttpClientMappingRegistry());

    // Register default client as HttpClient
    services.TryAddTransient(s =>
    {
        return s.GetRequiredService<IHttpClientFactory>().CreateClient(string.Empty);
    });

    return services;
}

public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    AddHttpClient(services);

    return new DefaultHttpClientBuilder(services, name);
}

public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name, Action<HttpClient> configureClient)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    if (configureClient == null)
    {
        throw new ArgumentNullException(nameof(configureClient));
    }

    AddHttpClient(services);

    var builder = new DefaultHttpClientBuilder(services, name);
    builder.ConfigureHttpClient(configureClient);
    return builder;
}

在Asp.Net Core 6加入Minimal API

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
//在Asp.Net 6中,使用Minimal api
builder.Services.AddHttpClient("test", client =>
{
    client.BaseAddress = new Uri("http://localhost:5000");
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

//在這里注入IHttpClientFactory
app.MapGet("/", async (IHttpClientFactory httpClientFactory) =>
{
    var client = httpClientFactory.CreateClient("test");
    return await client.GetStringAsync("/");
});

app.Run();
HttpClient使用

在Asp.Net Core 6中使用Minimal API簡化項目

分享到:
標簽:HttpClient
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定