【发布时间】: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 容器)并像这样使用它。
标签: c# wpf .net-core async-await dotnet-httpclient