首先我认为我需要声明我是一个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;
}
感谢您的任何建议。
答案 0 :(得分:1)
最有可能的是,ASP.NET同步上下文导致死锁(请参阅详细信息here]。
您可以尝试在异步调用上使用ConfigureAwait(false);
以避免异步连续尝试获取同步上下文。
答案 1 :(得分:0)
我不知道如何使用AJAX让用户在浏览器中下载文件。您可以使用指向新.aspx页面的标准HTML链接,并将您的Web API调用代码放在您要链接到的新页面的Page_Load中。