HttpClient.PostAsync 无响应且无异常

Posted

技术标签:

【中文标题】HttpClient.PostAsync 无响应且无异常【英文标题】:HttpClient.PostAsync no response & no exceptions 【发布时间】:2020-08-09 10:28:59 【问题描述】:
public async static Task<string> GetResponse(string host, string request, HttpClient client)

    HttpContent content = new StringContent(request, Encoding.UTF8, "application/xml");
    HttpResponseMessage message = await client.PostAsync(host, content).ConfigureAwait(false);  // issue here
    string response = await message.Content.ReadAsStringAsync().ConfigureAwait(false);
    return response;

同一命名空间内的调用代码-

public async Task<string> Post(Transaction transaction)

    string postXml = PostXml.Create(transaction); // serializes object to XML
    string response = await GetResponse(host, postXml, client); // client initialized in constructor of this class
    return await Deserialize.Response(response);

上述方法在直接从单元测试中调用时会按预期运行。

我有一个接口来利用不同服务的动态加载——它调用Task&lt;string&gt; Post(Transaction transaction) 方法。从我的主项目调用此方法时 - 已加载相关服务(取决于设置),但我没有收到来自 client.PostAsync(host, content) 的响应。

没有异常或错误。我试图用断点调试问题,但一无所获。它点击PostAsync 并继续转义其余代码。

注意 1:一切都是异步的,并且没有任何线程阻塞代码,例如 .Wait().Result 任何地方

注 2:我也尝试通过删除 ConfigureAwait 来运行它。在这两种情况下,单元测试都能完美运行。当我在我的主项目中引用这个项目时,它以某种方式不起作用。我仍然不明白,因为我仍然到达那部分代码。除此之外,程序仍然运行而不阻塞 UI 线程,但没有响应。



更新

为了获得host,我正在阅读一个配置 json 文件。读取此文件导致了我面临的问题,当我将主机硬编码为变量时,一切正常。最初该文件的读取是异步的,但为了调试问题,我将其更改为同步读取 - 这仍然没有解决问题。

注意 - 使用 App.Config 效果很好。

我正在使用 newtonsoft 读取自定义 json 设置文件。由于它的 XML 结构和访问自定义部分的复杂方式,我不太喜欢从 app.config 读取配置。

public static ServerConfig GetServerSettings()

    string json = File.ReadAllText("appSettings.json");
    return JsonConvert.DeserializeObject<ServerConfig>(json);

ServerConfig 具有我想要访问的属性,即 string hoststring company(即哪个公司的数据)。

【问题讨论】:

您是否已经尝试删除 ConfigureAwait(false),如果它在有问题的线路上有效或无效? 不相关;但我看到你在每次调用中都创建了 HttpClient 。最佳实践和推荐用法是重用 HttpClient。请查收:docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/… @tontonsevilla 是的,我已经尝试过了,但我仍然遇到同样的问题。 @TheodorZoulias 实际上我没有尝试捕捉。这个问题的原因我尝试了几件事,这是我在将其复制粘贴到 SO 之前尝试的最后一件事 @Bandook 基本上,如果可能的话,你可以在同一个类中声明和初始化一个静态 HttpClient 属性;然后在你的方法中使用它。我假设您不会让我们使用 DI/IoC,并且您不想将静态类/方法转换为非静态版本。我宁愿通过构造函数注入 HttpClient,并将我的帮助类和 HttpClient 创建/注册为单例(通过 DI 容器)并像这样使用它。 【参考方案1】:

在 WPF/WinForm 和(旧)ASP.NET 中,您必须使用 CongigureAwait(true)。 说的简单ConfigureAwait

是的:异步代码完成后返回到原始线程,在 Win/WPF 应用程序上这是必要的,因为只有主线程可以改变 GUI。 错误:异步代码完成后没有必要返回原来的线程。

更多信息 MSDN Magazine

【讨论】:

这是在图书馆里面。我也用configureawait试过了,我还是有同样的问题。 true 是无用的冗余,除非您想在运行时更改 ConfigureAwait 行为。那么最好不要使用ConfugureAwait 是的,这就是我的意思。完全删除了 ConfigureAwait,同样的问题。

以上是关于HttpClient.PostAsync 无响应且无异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 httpClient.postasync 进行 web api 调用 .net core

带有json字符串的后台任务中的UWP Httpclient postasync

HttpClient.PostAsync 崩溃应用。如何捕捉异常?

异步等待 HttpClient.PostAsync 调用

如何使用 HttpClient.PostAsync 发送 XML 内容?

HttpClient.PostAsync 的字符编码问题