【发布时间】:2016-06-25 21:07:06
【问题描述】:
首先我认为我需要声明我是 C# 新手。我是一名 JS 和 CSS 开发人员,有相当多的 C 水平,所以这是一个相对较新的领域。
所以我有一个 ASP.NET 页面,我在其中向后面的代码发出 AJAX 请求,然后向 WebAPI 服务发出请求以将 zip 文件下载到代码隐藏中,客户端执行不需要收到拉链。
当我将下面的代码粘贴到Page_Load 中时,一切正常,我得到了一个 zip 文件的字节数组。但是,当在具有 [webmethod] 属性的方法中使用时,它会命中 webAPI 服务但挂起。当服务返回时,什么也没有发生。
锁定在线var res = client.GetAsync("/someURl").Result。
我对 WebAPI 有控制权,但由于它返回正常,并且在不使用该属性时一切正常,我不相信问题出在这端。但是,如果需要,我也可以从那里发布相关代码。
所以我有两个问题,首先是什么导致了这种行为?
第二个我对垃圾收集有很好的处理是 JS 在使用闭包等时,但不是在这里。我听说过相互矛盾的建议,我应该也不应该在 HttpClient 对象上使用 using 关键字。我没有在整个过程中使用单个客户端对象,而是在每次点击 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;
}
感谢您的建议。
【问题讨论】:
-
你说它命中了方法,但它挂起。它挂在哪一行?
-
@MikayilAbdullayev 对不起,是的,不知道我是怎么忘记的。刚刚更新。
-
在同步和异步方法混合使用时调用
Task.Result会导致死锁。如果要异步,则必须一直异步。 -
@Nkosi 但是当使用 .Result 时,它运行同步对吗?这里没有什么异步的吗?另外,如果这就是问题,为什么使用
[WebMethod]会导致问题?也有理由在这里解释我坚持使用.net 4所以不能与等待等异步? -
进行一些搜索,发现调用
.Result或.Wait等会导致WebMethod阻塞,但目前还没有找出原因。还在寻找
标签: c# asp.net-web-api webmethod dotnet-httpclient