【问题标题】:ASP HttpClient GetAsync is not responding, nor timing outASP HttpClient GetAsync 没有响应,也没有超时
【发布时间】:2016-12-22 11:25:01
【问题描述】:

我正在使用 HttpClient 在 ASP MVC 上创建 Instagram API 客户端,我正在尝试发出 get 请求,但它失败了,没有抛出异常或响应,也没有响应我的超时。这是我的代码:

 public class InstagramService
 {
    private HttpClient Client = new HttpClient {
       BaseAddress = new Uri("https://api.instagram.com/v1/"),
       Timeout = TimeSpan.FromMilliseconds(500)
    };
    public async Task<InstagramUser> GetInstagramUser(long? userId = null)
    {
       InstagramUser User = null;
       string Parameter = (userId == null) ? "self" : userId.ToString();
       try {
          var response = await Client.GetAsync("users/" + Parameter + "/" + GetAccessToken());
          if (response.IsSuccessStatusCode)
          {
              User = await response.Content.ReadAsAsync<InstagramUser>();
          }
      }catch(Exception e)
      {
          Console.WriteLine(e.Message);
          Console.WriteLine(e.InnerException.Message);
      }
      return User;
    }

    private string GetAccessToken()
    {
        return "?access_token=" + DB.config_det_sys.Single(i => i.codigo == "ACCESS_TOKEN_INSTAGRAM" && i.estado == true).Valor;
    }

 }

编辑

这里我添加了如何在 Home Controller 上调用我的服务,我仍然会测试将控制器更改为异步任务

public class HomeController : Controller
{
    private InstagramService IGService = new InstagramService();
    public ActionResult About()
    {
       var apiCall = IGService.GetInstagramUser();
       var model = apiCall.Result;
       return View(model);
    }
}

我在 Postman 上进行了测试,试图进行 API 调用,它确实有效,那么我在哪里未能捕捉到错误?

【问题讨论】:

  • 代码是怎么调用的?确保您没有在调用堆栈上进行任何阻塞调用
  • @Nkosi 在这里,我添加了我打算如何调用方法的片段
  • 检查 Stephen Cleary 的回答。我怀疑您正在对apiCall.Result 进行阻塞调用,这可能会导致死锁。将操作转换为使用 async/await

标签: c# asp.net asp.net-mvc


【解决方案1】:

你的问题在这里:

var model = apiCall.Result;

正如我在博客中所描述的,you shouldn't block on asynchronous code。这可能会导致死锁。

await代替Result

var model = await apiCall;

【讨论】:

  • 我有一点疑问,如果我为调用 GET 端点的服务创建另一个私有异步方法(因为我需要在每次调用时添加访问令牌),调用三个异步等待对象可能会影响性能?
  • @Forcefield:三个异步调用根本不会有明显的性能变化。
【解决方案2】:

添加到斯蒂芬的答案,将控制器的操作更新为async

public class HomeController : Controller {
    private InstagramService IGService = new InstagramService();
    public async Task<ActionResult> About() {
       var model = await IGService.GetInstagramUser();
       return View(model);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多