我正在.Net Core2.1中创建应用程序,并使用http客户端处理Web请求.问题是我必须发送并行调用以节省时间,为此我使用的是Task.WhenAll()方法,但是当我使用此方法时,我收到错误消息"此实例已启动一个或多个请求.属性只能在发送第一个请求之前修改"以前我使用的是RestSharp,一切正常,但我想使用httpclient.以下是代码:

public async Task<User> AddUser(string email)
{
    var url = "user/";
    _client.BaseAddress = new Uri("https://myWeb.com/");
    _client.DefaultRequestHeaders.Accept.Clear();
    _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(Constants."application/json"));
    _client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
    var json = new {email = email }
    var response = await _client.PostAsJsonAsync(url,json);
    if (response .IsSuccessStatusCode)
    { ....

下面是构造函数:

private readonly HttpClient _httpClient;

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

方法调用:

var user1 = AddUser("user@user.com");
var user2 = AddUser("test@test.com");

await Task.WhenAll(user1, user2);

以下是启动配置:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

那么我到底做错了什么呢?我是否需要使用AddTemperent()更改AddSingleton,或者是否存在任何其他问题.还有一个问题是,我需要在响应之后使用_client.Dispose(),因为我遵循的教程没有使用Dispose方法,所以我对此有点困惑.

推荐答案

在发出任何请求之前,HttpClient.DefaultRequestHeaders(和BaseAddress)只应设置一次.HttpClient只有在使用后不进行修改的情况下才可以安全地作为单例使用.

不要设置DefaultRequestHeaders,而是在发送的每个HttpRequestMessage上设置标题.

var request = new HttpRequestMessage(HttpMethod.Post, url);
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("{...}", Encoding.UTF8, "application/json");
var response = await _client.SendAsync(request, CancellationToken.None);

用JSON替换"{...}".

Asp.net相关问答推荐

在控制器中通过依赖项注入使用ASP.NET变量值时,不会持久化

C# ASP.NET Core Serilog 添加类名和方法到日志(log)

如何异步渲染局部视图

ASP.NET Web 应用程序 (.NET Framework) 与 ASP.NET Core Web 应用程序 (.NET Framework) 之间的差异

测试项目中的 App.config

如何从以特定名称开头的 appsettings 键中获取所有值并将其传递给任何数组?

Asp.Net 会话在 ashx 文件中为空

如何从 RouteData 获取路由名称?

如何在 ASP.NET Web API 中使用非线程安全的 async/await API 和模式?

无法加载文件或程序集'System.Web.WebPages.Razor,版本 = 3.0.0.0

是否应该将 project.lock.json 文件签入源代码管理? (ASP.NET 核心 1.0)

防止在 Visual Studio 2008 ASP.NET Web 窗体中复制粘贴时自动生成 ID

如何验证文件上传的文件类型?

为应用程序池Classic .NET AppPool提供服务的进程与 Windows 进程激活服务发生了致命的通信错误

您如何在 .net WebApi2 应用程序中的 OAuth2 令牌请求中使用额外参数

如何在 ASP.NET MVC 中设置时区?

在 ASP.NET 中使用 MasterPages 时使用 JQuery 的正确方法?

如何遍历自定义 vb.net 对象的每个属性?

如何在 asp.net 中实现Access-Control-Allow-Origin标头

ASP.NET 自定义控件 - 未知的服务器标记