C# .NET Core 2.1控制台应用程序中的IHttpClientFactory引用System.NET.Http

C# .NET Core 2.1控制台应用程序中的IHttpClientFactory引用System.NET.Http,c#,.net-core,.net-core-2.1,C#,.net Core,.net Core 2.1,工具 Visual Studio 2017专业版(15.8.7) dotnetcore SDK 2.1.403 场景 我正在尝试使用dotnet核心框架创建一个控制台应用程序。控制台应用程序需要发出API请求 我已经阅读了作为dotnet core 2.1一部分发布的新的IHttpClientFactory 这表明我需要添加到我的项目中的所有内容都是对Microsoft.Extensions.HttpNuGet包的引用。我已经做到了 问题 我已将IHttpClientFactory添加到类中

工具

  • Visual Studio 2017专业版(15.8.7)
  • dotnetcore SDK 2.1.403
场景

我正在尝试使用dotnet核心框架创建一个控制台应用程序。控制台应用程序需要发出API请求

我已经阅读了作为dotnet core 2.1一部分发布的新的
IHttpClientFactory

这表明我需要添加到我的项目中的所有内容都是对
Microsoft.Extensions.Http
NuGet包的引用。我已经做到了

问题

我已将
IHttpClientFactory
添加到类中,但visual studio仅选择
System.Net.Http
命名空间作为建议的引用:

问题


我做错了什么:S

Microsoft.Extensions.Http,它默认包含在
Microsoft.AspNetCore.App
包中,包含许多通常用于Http相关代码的包,例如它包括
System.Net

当您使用Microsoft.Extensions.Http的嵌套包中的内容时,仍然需要通过using语句引用它们

所以,这里没有问题。只需使用System.Net.Http在
中添加一个到您的类。

官方文档建议我需要添加到我的项目中的所有内容都是对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;
            }
        }

    }

}
使用系统;
使用System.Net.Http;
使用System.Threading.Tasks;
使用Microsoft.Extensions.DependencyInjection;
命名空间类型DhttpClient整合应用程序
{
班级计划
{
公共静态void Main(字符串[]args)=>Run().GetAwaiter().GetResult();
公共静态异步任务运行()
{
var servicecolection=新servicecolection();
配置(serviceCollection);
var services=serviceCollection.BuildServiceProvider();
Console.WriteLine(“创建客户端…”);
var github=services.GetRequiredService();
Console.WriteLine(“发送请求…”);
var response=wait github.GetJson();
var data=await response.Content.ReadAsStringAsync();
Console.WriteLine(“响应数据:”);
Console.WriteLine((对象)数据);
Console.WriteLine(“按任意键退出…”);
Console.ReadKey();
}
公共静态无效配置(IServiceCollection服务)
{
services.AddHttpClient(“github”,c=>
{
c、 BaseAddress=新Uri(“https://api.github.com/");
c、 DefaultRequestHeaders.Add(“接受”、“应用程序/vnd.github.v3+json”);//github API版本控制
c、 DefaultRequestHeaders.Add(“用户代理”,“HttpClientFactory示例”);//GitHub需要一个用户代理
})                        
.AddTypedClient();
}
私有类客户端
{
公共GitHubClient(HttpClient HttpClient)
{
HttpClient=HttpClient;
}
公共HttpClient HttpClient{get;}
//获取github上的服务列表。
公共异步任务GetJson()
{
var request=newhttprequestmessage(HttpMethod.Get,“/”;
var response=await-HttpClient.sendaync(请求).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
返回响应;
}
}
}
}

希望此帮助在您的csproj中添加此软件包参考

<PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.2" />


我认为您缺少了Microsoft.Extensions.DependencyInjection
,它使事情变得更简单。我认为添加Github特定配置的代码应该是GitHubClient类的静态成员,而不是配置中的匿名lambda。这对我很有帮助,尽管我需要一个更高的版本号