c# - HttpClient .Result 在使用 [WebMethod] 属性时挂起

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

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

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

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

它锁定在 var res = client.GetAsync("/someURl").Result 行。

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

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

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

编辑: 委托(delegate)处理程序正在向请求添加一些 header 以处理所有身份验证。

[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;
}

感谢您的任何建议。

最佳答案

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

关于c# - HttpClient .Result 在使用 [WebMethod] 属性时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032980/

相关文章:

c# - 页面 Web 方法在 Web 服务方法完美调用的 Ajax 调用中不起作用

c# - 用于序列化的 NameValueCollection 的替代方法

c# - 复制范围“如屏幕所示”时,Excel如何计算其生成的图元文件的分辨率?

c# - 如何统计来自db的搜索内容

asp.net - 尚未使用 Web Api Delegatinghandler 分配内部处理程序

c# - 从jQuery C#调用webmethod在.net aspx页面中返回404错误

C# - 如何从枚举器创建数组

visual-studio-2012 - Visual Studio 2012中的WebApi2

c# - 如何处理 WebAPI 上的路由冲突 - 字符串 ID 与操作 + id

c# - 将 html 组件添加到页面的 AJAX 最佳实践