Web Forms调用Web API PostAsync接口挂起问题求助
问题根源
你的代码卡在PostAsync语句,核心原因是异步调用时误用.Result导致死锁。在Web Forms的同步上下文(SynchronizationContext)中,.Result会阻塞当前线程,而异步方法执行完成后需要回到该上下文继续处理,两者互相等待,最终造成死锁。
修复步骤
修正按钮点击事件的异步调用方式
你的事件方法已经标记为async void(Web Forms事件处理允许该写法),直接将.Result替换为await即可:protected async void BtnSave_Click(object sender, EventArgs e) { var TempAudit = new CSAudit("ADMIN", DateTime.Now.ToString("yyyyMMdd")); CSSetup TempSetup = await CSCreateSetup(TempAudit); // 后续可添加TempSetup的业务处理逻辑 }优化HttpClient的使用(可选但推荐)
每次通过using创建HttpClient会消耗不必要的资源,建议复用全局单例实例:// 在全局位置(如Global.asax)初始化静态HttpClient private static readonly HttpClient _httpClient = new HttpClient(); public async Task<CSSetup> CSCreateSetup(CSAudit TempAudit) { var APIPath = Session["APIPath"].ToString(); CSSetup TempSetup = new CSSetup(); var json = JsonConvert.SerializeObject(TempAudit); var RawText = new StringContent(json, UnicodeEncoding.UTF8, "application/json"); _httpClient.BaseAddress = new Uri(APIPath); HttpResponseMessage response = await _httpClient.PostAsync("api/create", RawText); if (response.IsSuccessStatusCode) { TempSetup = await response.Content.ReadAsAsync<CSSetup>(); } else { Session["Message"] = "Error creating setup"; } return TempSetup; // 无需Task.FromResult,直接返回即可 }简化冗余代码
原代码中return await Task.FromResult(TempSetup);属于冗余写法,async方法可直接返回对象,编译器会自动包装为Task。
额外检查项
- 确认
Session["APIPath"]存储的URL格式正确,避免结尾多斜杠或缺少必要路径段 - 可添加HttpClient超时设置,防止因网络问题无限等待:
_httpClient.Timeout = TimeSpan.FromSeconds(30);
内容的提问来源于stack exchange,提问作者Eli Kihara
相关产品推荐
相关产品推荐

