使用[WebMethod]属性时,HttpClient .Result挂起

时间:2016-06-25 21:07:07

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

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

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

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

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

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

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

第二,我在处理垃圾收集方面有很好的处理是JS在使用闭包等但不在这里。我听到了相互矛盾的建议,即我应该而且不应该使用using对象上的HttpClient关键字。我并没有使用单个客户端对象,而是每次遇到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;
}

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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