如何解决System.Net.Http.dll中抛出的System.FormatException异常?
解决System.FormatException异常方案
核心问题分析
你遇到的System.FormatException大概率是因为手动添加Content-Type请求头的方式不规范,.NET的HttpHeaders对特殊头的格式校验严格,直接使用Add方法可能触发格式验证失败,哪怕注释掉其中一行也无法解决。
修复步骤
替换Content-Type的设置方式:
不要使用Headers.Add手动添加Content-Type,而是通过StringContent的构造函数直接指定,或者使用content.Headers.ContentType属性设置——这两种方式会自动处理头的格式规范,避免校验错误。移除重复的Content-Type头:
text/json是非标准的JSON媒体类型,标准类型是application/json,只需要保留后者即可。
修改后的完整代码
private void Dial(object sender, RoutedEventArgs e) { // 异步方法调用需避免上下文脱离,此处用丢弃运算符处理无返回值场景 _ = SendDataAsync(sender, e); } private async Task SendDataAsync(object sender, RoutedEventArgs e) { var toSend = new Dictionary<string, string> { { "ClientID", ConfigurationManager.AppSettings["ClientID"] ?? string.Empty }, { "PhoneNumber", numberToSend ?? string.Empty } }; string jsonString = JsonSerializer.Serialize(toSend); // 方式1:构造函数直接指定编码与媒体类型(推荐) var content = new StringContent(jsonString, Encoding.UTF8, "application/json"); // 方式2:通过ContentType属性设置(二选一即可) // content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var response = await client.PostAsync("https://webhook.site/4788266d-9caf-4747-a3d2-09777b233435", content); var responseString = await response.Content.ReadAsStringAsync(); }
额外注意事项
- 原代码中
Dial方法调用异步方法未使用await,会导致异步操作脱离上下文,可能引发不可预期的线程问题,建议按示例处理。 - 给
ClientID和PhoneNumber添加空值判断,避免序列化出无效JSON。 - 确保
HttpClient实例client是正确初始化的(推荐单例模式创建,避免频繁实例化)。
内容的提问来源于stack exchange,提问作者jaroslavbobek2003probtmp
相关产品推荐
相关产品推荐

