【问题标题】:HttpClient.PostAsync no response & no exceptionsHttpClient.PostAsync 无响应且无异常
【发布时间】: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 容器)并像这样使用它。

标签: c# wpf .net-core async-await dotnet-httpclient


【解决方案1】:

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

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

更多信息 MSDN Magazine

【讨论】:

  • 这是在图书馆里面。我也用configureawait试过了,我还是有同样的问题。
  • true 是无用的冗余,除非您想在运行时更改 ConfigureAwait 行为。那么最好不要使用ConfugureAwait
  • 是的,这就是我的意思。完全删除了 ConfigureAwait,同样的问题。
猜你喜欢
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
相关资源
最近更新 更多