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

C#中如何让Http Post异步函数将响应返回至主程序?

解决C#异步PostData返回响应内容的问题

核心修改要点

  • 将PostData方法返回类型改为Task<string>,并在方法内返回响应body
  • 主程序使用await而非Wait()调用异步方法,正确获取返回值

修改后的完整代码

主程序代码(支持异步入口)

// .NET Core/.NET 5+ 允许将主方法标记为async
static async Task Main(string[] args)
{
    CallingClass cls = new CallingClass();
    // 通过await直接获取异步方法的返回结果
    string responseBody = await cls.PostData(accesstoken, thejsondata);
    // 此处即可使用获取到的响应内容
    Console.WriteLine(responseBody);
}

CallingClass修改后的代码

public class CallingClass
{
    private static readonly HttpClient client = new HttpClient();

    // 修改返回类型为Task<string>
    public async Task<string> PostData(string accesstoken, string thejsondata)
    {
        var request = new HttpRequestMessage
        {
            Method = HttpMethod.Post,
            RequestUri = new Uri("https://whateverurl.com/"),              
            Headers =
            {
                { "Authorization", accesstoken }
            },
            Content = new StringContent(thejsondata)
            {
                Headers =
                {
                    ContentType = new MediaTypeHeaderValue("application/json")
                }
            }
        };
        using (var response = await client.SendAsync(request))
        {
            response.EnsureSuccessStatusCode();
            var body = await response.Content.ReadAsStringAsync();
            int responseStatusCode = (int)response.StatusCode;
            
            // 直接用数值对比替代字符串转换,更高效
            if (responseStatusCode == 200 || responseStatusCode == 201)
            {
                hlp.AddToOutputFolder($"StatusCode -  {responseStatusCode}");
                hlp.AddToOutputFolder($"Response -  {body}");
            }
            else
            {
                hlp.AddToOutputFolder($"ERROR RESPONSE STRING= {responseStatusCode}");
            }

            // 返回响应主体内容
            return body;
        }
    }
}

关键说明

  • 之前使用Wait()仅会阻塞等待任务完成,但无法获取返回值;若必须同步调用(不推荐),可使用PostData(...).Result,但该写法在UI线程、传统ASP.NET环境中易引发死锁,因此优先使用await。
  • 若项目基于旧版.NET Framework,无法使用async Task Main,可将业务逻辑封装到独立的async方法中,再同步调用,但需注意避免阻塞主线程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:37:03