【发布时间】:2018-03-07 01:30:26
【问题描述】:
在一个 WPF 前端的项目上工作,并试图处理对 HttpClient 的异步调用,我一直在四处走动,试图让 PostAsync 工作,但它通常会出现死锁,或者至少发布响应超时,即使超时值很大,并且在提琴手中有可见的响应。
所以,过了一会儿,我决定在 HttpClient 上尝试其他一些方法,它们都奏效了,首先尝试一下。不知道为什么。
我一直使用awaits、asyncs 和.ConfigureAwait(false)(我认为)来清理我的 WPF 按钮:
按钮:
private async void Generate_Suite_BTN_Click(object sender, RoutedEventArgs e)
{
await suiteBuilder.SendStarWs().ConfigureAwait(false);
}
XmlDoc 加载:
internal async Task SendStarWs()
{
var xmlDoc = new XmlDocument();
xmlDoc.Load("C:\\Temp\\file.xml");
await StarWSClient.SendStarMessage(xmlDoc).ConfigureAwait(false);
}
发送消息:
private static readonly HttpClient Client = new HttpClient {MaxResponseContentBufferSize = 1000000};
public static async Task<STARResult> SendMessage(vars)
{
var response = await SendRequestAsync(url, contentNew, Client).ConfigureAwait(false);
return new STARResult(response, hash);
}
这会立即针对我的端点调用“500s”,这是我所期望的:
var response = await SendRequestAsync(url, contentNew, Client).ConfigureAwait(false);
private static async Task<HttpResponseMessage> SendRequestAsync(string adaptiveUri, StringContent content, HttpClient httpClient)
{
HttpResponseMessage responseMessage = null;
try
{
responseMessage = await httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Post, adaptiveUri)).ConfigureAwait(false);
}
catch (Exception ex)
{
if (responseMessage == null)
responseMessage = new HttpResponseMessage
{
StatusCode = HttpStatusCode.InternalServerError,
ReasonPhrase = $"SendRequestAsync failed: {ex.Message}"
};
}
return responseMessage;
}
Post 变体返回一个 TaskCancellationException,并带有超时消息,无论超时值如何:
var response = await PostRequestAsync(url, contentNew, Client).ConfigureAwait(false);
private static async Task<HttpResponseMessage> PostRequestAsync(string adaptiveUri, StringContent content, HttpClient httpClient)
{
HttpResponseMessage responseMessage = null;
try
{
responseMessage = await httpClient.PostAsync(adaptiveUri, content).ConfigureAwait(false);
}
catch (Exception ex)
{
if (responseMessage == null)
responseMessage = new HttpResponseMessage
{
StatusCode = HttpStatusCode.InternalServerError,
ReasonPhrase = $"PostRequestAsync failed: {ex.Message}"
};
}
return responseMessage;
}
我的端点正常响应我们的其他软件,所以我很确定端点是可靠的,我无法理解为什么发送响应被阻止,而发送却没有。
【问题讨论】:
-
在您使用
SendAsync时,您并未包含内容。在PostAsync中包含内容。我认为这与您的问题比您使用的方法更相关。 -
好点 - 我更改了发送到包含的内容,现在它具有相同的行为。现在要弄清楚为什么它会超时。
标签: c# wpf async-await dotnet-httpclient