【问题标题】:How can I complete this REST implementation?我怎样才能完成这个 REST 实现?
【发布时间】: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 记录以指向不同的内部服务器) .现在您的服务将停止工作,因为它没有在新地址上使用。修复它的唯一方法是重新启动服务。这很麻烦,您可能一开始就不知道服务失败的原因是什么。

标签: c# .net


【解决方案1】:

你没有从方法返回任何东西

public async Task GetData()
        {
            return await Client.GetAsync("https://www.test.com/users");
        }

从方法返回结果。

【讨论】:

  • 你不能只返回结果。那仍然无法编译。
  • 当然。您还需要更改返回类型。
  • 它仍然无法编译。你以前用过await吗?
  • 我更新了答案。请看一看。希望它会有所帮助。
  • 不,仍然无法编译。如果要返回某些内容,则需要在异步时将返回类型设置为 Task。停止猜测,花点时间验证您提供的解决方案是否正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2020-02-07
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多