我正在.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相关问答推荐

在 aspx 页面中使用 if else 和 eval

在正则表达式中允许 -(破折号)

/应用程序中的服务器错误. ASP.NET

如何在 ASP.NET 中使用时区?

如何使用 jQuery 设置 outerHTML

使用 JavaScript 更改 ASP.NET 标签的可见性

在属性中实现逻辑是一种好习惯吗

Web Api 请求内容在操作过滤器中为空

如何在 Visual Studio 2017 中使用 NPM 并安装包?

IIS 7.5 上没有 asp.net 功能

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

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

如何在 ASP.NET Core Web API 中配置 JSON 格式的缩进

不能在 DropDownList 中 Select 多个项目

这个rendersection的代码是什么意思?

如何在 ASP.net 中使用 wkhtmltopdf.exe

ASP .NET 单例

盒式磁带包与 MVC4 包

如何调试 w3wp clr.dll 错误

无法使用 ip:port 访问 WEB API,但可以在 VS 调试模式下使用 localhost:port