You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web Forms调用Web API PostAsync接口挂起问题求助

问题根源

你的代码卡在PostAsync语句,核心原因是异步调用时误用.Result导致死锁。在Web Forms的同步上下文(SynchronizationContext)中,.Result会阻塞当前线程,而异步方法执行完成后需要回到该上下文继续处理,两者互相等待,最终造成死锁。

修复步骤
  1. 修正按钮点击事件的异步调用方式
    你的事件方法已经标记为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的业务处理逻辑
    }
    
  2. 优化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,直接返回即可
    }
    
  3. 简化冗余代码
    原代码中return await Task.FromResult(TempSetup);属于冗余写法,async方法可直接返回对象,编译器会自动包装为Task。

额外检查项
  • 确认Session["APIPath"]存储的URL格式正确,避免结尾多斜杠或缺少必要路径段
  • 可添加HttpClient超时设置,防止因网络问题无限等待:
    _httpClient.Timeout = TimeSpan.FromSeconds(30);
    

内容的提问来源于stack exchange,提问作者Eli Kihara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:31:16