.NET Core 2.1控制台应用程序中的IHttpClientFactory引用了System.Net.Http。

14

工具

  • Visual Studio 2017 Professional (15.8.7)
  • dotnetcore SDK 2.1.403

场景

我正在尝试使用dotnet core框架创建控制台应用程序。控制台应用程序需要进行API请求。

我了解到dotnet core 2.1中发布了新的IHttpClientFactory

官方文档建议我只需将Microsoft.Extensions.Http NuGet包添加到我的项目中即可。我已经完成了这一步骤。

问题

我将IHttpClientFactory添加到一个类中,但是Visual Studio只会提示System.Net.Http命名空间作为建议的引用:

enter image description here

问题

我做错了什么 :S

3个回答

27

官方文档建议我在项目中添加对Microsoft.Extensions.Http NuGet包的引用。我已经做到了。

这是正确的,但为了让事情更容易,您需要添加 Microsoft.Extensions.DependencyInjection 作为一个NuGet包,实际上,您可以将httpClient实例的所有创建委托给 HttpClientBuilderExtensions ,它添加了很多扩展方法来创建一个 命名或类型化的 HTTPClient,下面是一个示例:

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


namespace TypedHttpClientConsoleApplication
{
    class Program
    {
        public static void Main(string[] args) => Run().GetAwaiter().GetResult();
        public static async Task Run()
        {
            var serviceCollection = new ServiceCollection();


            Configure(serviceCollection);

            var services = serviceCollection.BuildServiceProvider();

            Console.WriteLine("Creating a client...");
            var github = services.GetRequiredService<GitHubClient>();

            Console.WriteLine("Sending a request...");
            var response = await github.GetJson();

            var data = await response.Content.ReadAsStringAsync(); 
            Console.WriteLine("Response data:");
            Console.WriteLine((object)data);

            Console.WriteLine("Press the ANY key to exit...");
            Console.ReadKey();
        }
        public static void Configure(IServiceCollection services)
        {







            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
            })                        
            .AddTypedClient<GitHubClient>();
        }
        private class GitHubClient
        {
            public GitHubClient(HttpClient httpClient)
            {
                HttpClient = httpClient;
            }

            public HttpClient HttpClient { get; }

            // Gets the list of services on github.
            public async Task<HttpResponseMessage> GetJson()
            {
                var request = new HttpRequestMessage(HttpMethod.Get, "/");

                var response = await HttpClient.SendAsync(request).ConfigureAwait(false);
                response.EnsureSuccessStatusCode();

                return response;
            }
        }

    }

}

希望这能帮到你


我认为添加Github特定配置的代码应该是class GitHubClient的静态成员,而不是Configure中的匿名lambda函数。只是我的个人看法。 - Dai

9
Microsoft.Extensions.Http 是默认包含在 Microsoft.AspNetCore.App 包中的,它包含了许多常用于 http 相关代码的包,例如 System.Net 包。
当您使用 Microsoft.Extensions.Http 的嵌套包时,仍需要通过 using 语句 引用它们。
所以,这里没有任何问题。只需在您的类中添加 using System.Net.Http; 即可。

1
我认为你缺少 Microsoft.Extensions.DependencyInjection,它可以让事情变得更容易。 - BRAHIM Kamel

2
在你的 csproj 中添加这个包引用。
<PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.2" />

这对我有帮助,尽管我需要更高的版本号<PackageReference Include="Microsoft.AspNetCore.App" Version="3.1.3" /> - Netricity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接