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

C# HttpClient.Result在使用[WebMethod]属性时挂起,c#,asp.net-web-api,webmethod,dotnet-httpclient,C#,Asp.net Web Api,Webmethod,Dotnet Httpclient,首先,我想我需要声明我是个新手。我是一个JS和CSS开发人员,有一点C语言,所以这是一个相对较新的领域 所以我有一个ASP.NET页面,我向代码隐藏发出AJAX请求,然后向WebAPI服务发出请求,将zip文件下载到代码隐藏中,客户端不需要接收zip 当我将下面的代码粘贴到页面加载中时一切正常,我得到了zip文件的字节数组。但是,当在具有[webmethod]属性的方法中使用时,它会命中webAPI服务,但会挂起。当服务返回时,什么也不会发生 它在第var res=client.GetAsync

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

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

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

它在第
var res=client.GetAsync(“/someURl”).Result行上锁定

我对WebAPI有控制权,但由于它的返回很好,并且当不使用该属性时,一切都很好,所以我不认为问题就出在这方面。不过,如果需要,我也可以从那里发布相关代码

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

第二,在处理闭包等时,我对垃圾收集有很好的处理能力,但这里没有。我听到了一些相互矛盾的建议,我应该也不应该在
HttpClient
对象上使用
using
关键字。我不是在整个过程中使用单个客户机对象,而是在每次使用ajax方法时创建一个新的客户机对象。所以让
使用
就在这里,不是吗

编辑: 委托处理程序正在向请求添加一些头来处理身份验证,仅此而已

[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;
}
[WebMethod]
公共静态布尔同步申请人(内部id)
{
var serviceOne=DIFactory.Resolve();
var settings=serviceOne.GetCompanySettings();
尝试
{
var delegatingHandler=new-webapidelgatinghandler((Guid)settings.AppId,settings.ApiKey);
使用(var client=HttpClientFactory.Create(delegatingHandler))
{
client.BaseAddress=新Uri(settings.ApiUrl);
使用(var res=client.GetAsync(“/someURl”).Result)
{
var d=res.Content.ReadAsByteArrayAsync().Result;
}
}
}
捕获(例外情况除外)
{
var x=ex;
返回false;
}
返回true;
}

谢谢您的建议。

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

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

您说它命中了方法,但挂起了。挂起在哪一行?@MikayilAbdullayev抱歉,是的,不知道我是如何忘记的。现在刚刚更新。调用
任务。结果
在同步和异步时可能会导致死锁ronous方法是混合的。如果要异步,则必须始终异步。@Nkosi但在使用.Result时,它会运行sync,对吗?这里没有异步?如果这是问题,为什么要使用
[WebMethod]
导致问题?也是为了说明原因,我一直在使用
.net 4
所以不能与Wait等异步?做一些搜索,并找到调用
.Result
的结果。Wait
等会导致
WebMethod
阻塞,但还没有找到原因。我还在做一个假设。你想知道吗用户没有收到ZIP?或者网页将使用数据?感谢您的回答。再次阅读我的问题,听起来好像我正在尝试下载到客户端。但是,我不会更新我的问题。由于每个人的输入,我已经找到了解决方案。我会很快添加它。