【问题标题】:HttpClient .Result hangs when [WebMethod] attribute used使用 [WebMethod] 属性时,HttpClient .Result 挂起
【发布时间】:2016-06-25 21:07:06
【问题描述】:

首先我认为我需要声明我是 C# 新手。我是一名 JS 和 CSS 开发人员,有相当多的 C 水平,所以这是一个相对较新的领域。

所以我有一个 ASP.NET 页面,我在其中向后面的代码发出 AJAX 请求,然后向 WebAPI 服务发出请求以将 zip 文件下载到代码隐藏中,客户端执行不需要收到拉链。

当我将下面的代码粘贴到Page_Load 中时,一切正常,我得到了一个 zip 文件的字节数组。但是,当在具有 [webmethod] 属性的方法中使用时,它会命中 webAPI 服务但挂起。当服务返回时,什么也没有发生。

锁定在线var res = client.GetAsync("/someURl").Result

我对 WebAPI 有控制权,但由于它返回正常,并且在不使用该属性时一切正常,我不相信问题出在这端。但是,如果需要,我也可以从那里发布相关代码。

所以我有两个问题,首先是什么导致了这种行为?

第二个我对垃圾收集有很好的处理是 JS 在使用闭包等时,但不是在这里。我听说过相互矛盾的建议,我应该也不应该在 HttpClient 对象上使用 using 关键字。我没有在整个过程中使用单个客户端对象,而是在每次点击 ajax 方法时创建一个新的客户端对象。那么using 就在这里不是吗?

编辑: 委托处理程序正在向请求中添加一些标头来处理身份验证。

[WebMethod]
public static bool SyncApplicant(int id)
{
  var serviceOne = DIFactory.Resolve<IServiceOne>();
  var settings= serviceOne .GetCompanySettings();

  try
  {
    var delegatingHandler = new WebApiDelegatingHandler((Guid)settings.AppId, settings.ApiKey);

    using (var client = HttpClientFactory.Create(delegatingHandler))
    {
      client.BaseAddress = new Uri(settings.ApiUrl);

      using (var res = client.GetAsync("/someURl").Result)
      {
        var d = res.Content.ReadAsByteArrayAsync().Result;
      }
    }
  }
  catch (Exception ex)
  {
    var x = ex;
    return false;
  }
  return true;
}

感谢您的建议。

【问题讨论】:

  • 你说它命中了方法,但它挂起。它挂在哪一行?
  • @MikayilAbdullayev 对不起,是的,不知道我是怎么忘记的。刚刚更新。
  • 在同步和异步方法混合使用时调用Task.Result会导致死锁。如果要异步,则必须一直异步。
  • @Nkosi 但是当使用 .Result 时,它运行同步对吗?这里没有什么异步的吗?另外,如果这就是问题,为什么使用[WebMethod] 会导致问题?也有理由在这里解释我坚持使用.net 4 所以不能与等待等异步?
  • 进行一些搜索,发现调用.Result.Wait 等会导致WebMethod 阻塞,但目前还没有找出原因。还在寻找

标签: c# asp.net-web-api webmethod dotnet-httpclient


【解决方案1】:

很可能,死锁是由 ASP.NET 同步上下文引起的(请参阅详细信息 here]。 您可以尝试在异步调用上使用ConfigureAwait(false);,以避免异步继续尝试获取同步上下文。

【讨论】:

    【解决方案2】:

    我不知道您将如何使用 AJAX 让用户在浏览器中下载文件。您可以使用标准 HTML 链接到一个新的 .aspx 页面,并将您的 Web API 调用代码放在您要链接到的新页面的 Page_Load 中。

    【讨论】:

    • 我在这里做一个假设。您希望用户收到 ZIP 吗?还是网页会使用这些数据?
    • 感谢您的回答。再次阅读我的问题听起来确实像是我正在尝试下载到客户端。但是我不会生病更新我的问题。感谢大家的投入,我找到了解决方案。我会尽快添加它。
    猜你喜欢
    • 2018-03-04
    • 2013-11-03
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多