最可靠方式是全局复用HttpClient单例或IHttpClientFactory,用HttpRequestMessage设置临时Header,JSON提交需显式指定Content-Type为application/json,所有IO操作必须await,特殊Header如Bearer Token和Cookie应分别用AuthenticationHeaderValue和Add方法正确设置。用 HttpClient 发送带 Header 的 POST 最可靠直接用 HttpClient,别碰过时的 WebClient 或裸写的 HttpWebRequest。前者默认复用连接、线程安全、支持 async/await;后两者容易漏关流、没自动处理编码、Header 设置逻辑分散。常见错误是每次请求都 new 一个 HttpClient 实例——这会导致端口耗尽、DNS 缓存失效。必须全局复用单例或用 IHttpClientFactory(ASP.NET Core 环境下)。实操建议:在 Startup / Program.cs 中注册 HttpClient:用 AddHttpClient<MyService>() 而不是 services.AddSingleton<HttpClient>()Header 必须在发送前设置,不能写在 body 后面;PostAsync 不接受 header 参数,得提前往 DefaultRequestHeaders 或 HttpRequestMessage 上加如果要为单次请求设临时 header(比如带 token),用 HttpRequestMessage 更清晰,避免污染 client 的默认头Content-Type 设错导致后端收不到数据POST 提交 JSON 却忘了设 Content-Type: application/json,后端(尤其 ASP.NET Core Web API)会直接返回 400 或空 body——它根本没尝试反序列化。常见误区是以为 StringContent 构造函数第二个参数(Encoding)能代替 content-type,其实它只管字节编码,不设 header。实操建议:JSON 提交:用 new StringContent(json, Encoding.UTF8, "application/json")表单提交:new FormUrlEncodedContent(new Dictionary<string, string> { ["key"] = "val" }),它自动设 application/x-www-form-urlencoded上传文件:用 MultipartFormDataContent,它自动设 multipart/form-data 并生成 boundary手动设 header 时,优先用 client.DefaultRequestHeaders.TryAddWithoutValidation("X-Api-Key", "xxx"),TryAddWithoutValidation 能绕过某些非法字符校验(比如含空格的自定义 header 值)异步没等完就释放 HttpClient 或读响应体写 var res = client.PostAsync(...).Result 或 .Wait(),在 UI 线程或 ASP.NET 同步上下文里极易死锁。更隐蔽的问题是:没 await response.Content.ReadAsStringAsync() 就直接 return,导致调用方拿到未完成的 Task。 文小言 百度旗下新搜索智能助手,有问题,问小言。

更多推荐