首先我想我需要声明我是 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/