【发布时间】:2017-12-21 19:16:17
【问题描述】:
MyService 使用 HttpClient.GetAsync() 调用 REST uri。我在同一解决方案中从控制台应用程序的 Main 方法调用服务方法,但返回以下结果:
Id = 3, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"
我需要做什么来完成这个 REST 实现?
我的服务:
using System.Net.Http;
using System.Threading.Tasks;
namespace Services
{
public class MyService
{
private static HttpClient Client = new HttpClient();
public void GetData()
{
var result = await Client.GetAsync("https://www.test.com/users");
}
}
}
来自控制台 Main() 的服务调用:
var result = new MyService().GetData();
更新
好的,我将方法实现更新为如下所示:
public async Task<HttpResponseMessage> GetData()
{
var result = await Client.GetAsync("https://www.test.com/users");
return result;
}
但是,这仍然返回我在原始帖子中包含的相同值。我在这里错过了什么?
【问题讨论】:
-
重构 GetData 以返回异步任务。
-
@mason OP 使用 HttpClient 怎么错了?您应该使用私有静态实例。为什么要为简单的 GET 请求引入单独的库/依赖项?
-
如果您要在方法中使用 await,您的方法必须标记为异步。如果你的方法被标记为异步,它应该几乎总是返回一个 Task 或一个 Task
。顺便说一句,我不建议直接使用 HttpClient。相反,看看 Flurl 或 RestSharp。 -
@maccettura 他们不一定做错了,我看错了。我读得太快了,以为他们每次都在实例化一个实例而不是静态的。但是,您应该有一个 每个域 的 HttpClient。因此,如果有另一个服务访问同一个域,或者该服务访问其他域,这可能是一个问题。 HttpClient 使事情变得比他们必须的要困难得多。切换到 Flurl 或 RestSharp 可以防止您陷入这些坑,语法更好,并且可以为您进行 JSON 转换。
-
@maccettura HttpClient 存在问题的另一个例子是它不响应 DNS 更改。因此,假设您的服务中有一个静态 HttpClient,然后它调用的服务器会更改 IP 地址(可能是第 3 方,或者您的 IT 部门正在更改该 DNS 记录以指向不同的内部服务器) .现在您的服务将停止工作,因为它没有在新地址上使用。修复它的唯一方法是重新启动服务。这很麻烦,您可能一开始就不知道服务失败的原因是什么。