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<string> 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 host
和 string 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
:
更多信息 MSDN Magazine
【讨论】:
这是在图书馆里面。我也用configureawait试过了,我还是有同样的问题。true
是无用的冗余,除非您想在运行时更改 ConfigureAwait
行为。那么最好不要使用ConfugureAwait
。
是的,这就是我的意思。完全删除了 ConfigureAwait,同样的问题。以上是关于HttpClient.PostAsync 无响应且无异常的主要内容,如果未能解决你的问题,请参考以下文章
使用 httpClient.postasync 进行 web api 调用 .net core
带有json字符串的后台任务中的UWP Httpclient postasync
HttpClient.PostAsync 崩溃应用。如何捕捉异常?