C# 为什么第二个HttpClient.PostAsync返回500?
在下面的代码中,我在第一次请求中收到200,之后收到500。我是C# 为什么第二个HttpClient.PostAsync返回500?,c#,asp.net-core,C#,Asp.net Core,在下面的代码中,我在第一次请求中收到200,之后收到500。我是.Net Core C#新手,因此我学会了只分配一次特定的HttpClient属性,即超时 然而,我的自动测试第一次成功,但之后500次成功。我正在使用HttpClientFactory if (httpClient.Timeout == null) { httpClient.Timeout = TimeSpan.FromSeconds(Foo.timeout); } if (httpClient.BaseAddress
.Net Core C#
新手,因此我学会了只分配一次特定的HttpClient属性,即超时
然而,我的自动测试第一次成功,但之后500次成功。我正在使用HttpClientFactory
if (httpClient.Timeout == null)
{
httpClient.Timeout = TimeSpan.FromSeconds(Foo.timeout);
}
if (httpClient.BaseAddress == null) {
httpClient.BaseAddress = new Uri(Foo.url);
}
response = await httpClient.PostAsync("", content);
我发现代码有问题。我应该为每个Http请求使用HttpClientFactory创建HttpClient的新实例:
_httpClient = _httpClientFactory.CreateClient(command.ClientId);
公共类Foo
{
私有只读IHttpClientFactory\U httpClientFactory;
公共Foo(IHttpClientFactory httpClientFactory)
{
_httpClientFactory=httpClientFactory;
}
公共异步任务栏()
{
var httpClient=_httpClientFactory.CreateClient(“Foo”);
使用var response=wait-httpClient.PostAsync(“example.com”,new-StringContent(“Foo”);
返回response.RequestMessage;
//这里不再引用_httpclient,垃圾
//收集器将进行清洁
//启动_httpclient并释放该实例
//叫一个新的
//已创建_httpclient的实例
}
}
HTTP 500表示服务器端错误。这不是您的代码,而是服务器端代码中的错误。如果是客户端错误,您会得到HTTP 400-499状态代码。顺便说一句,服务器端错误可能是由服务器无法处理的错误请求引起的。无论如何,这不是HttpClient的一个附带问题。@为什么伪代码在这里被提升?它如何帮助其他成员解决他们的问题?@aepot发布的代码根本不是psuedocode。你在说什么?public-httpresponse-Bar()
你发布的代码根本不会编译。@aepot发布的代码是在Visual Studio 2019和Linqpad 6.1中编译的有效C#8.0。public-httpresponse-Bar()
中的httpresponse是什么?2) 返回响应
将立即导致返回响应的.Dispose()
(使用
语句)。因此,您将返回一个已处理的对象。3) 收集器将清理
将不编译4)调用新的
将不编译。-这是不可编译的伪代码。
public class Foo
{
private readonly IHttpClientFactory _httpClientFactory;
public Foo(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task<HttpRequestMessage> Bar()
{
var httpClient = _httpClientFactory.CreateClient("Foo");
using var response = await httpClient.PostAsync("example.com", new StringContent("Foo"));
return response.RequestMessage;
// here as there is no more reference to the _httpclient, the garbage
//collector will clean
// up the _httpclient and release that instance. Next time the method is
//called a new
// instance of the _httpclient is created
}
}