.NET Framework服务HTTP请求异常:UTF-8不是有效编码名称
问题描述
在.NET Framework服务中发起HTTP请求时,多数客户端运行正常,但特定场景下抛出异常。转译后的错误信息为:
"The character set provided in the ContentType is invalid."……"UTF-8 is not a valid encoding name."
相关代码片段:
requestMessage.Content = new System.Net.Http.StringContent(json, Encoding.UTF8, "application/json"); TaskAwaiter<HttpResponseMessage> response; try { response = HTTPClient.SendAsync(requestMessage).GetAwaiter(); } catch (Exception e) { throw new CDBAPIException($"Falha POST {url}", e); } try { var result = response.GetResult(); if (result.StatusCode != System.Net.HttpStatusCode.OK) { throw new CDBAPIException($"Falha POST {result.StatusCode} - {result.ReasonPhrase}"); } var content = response.GetResult().Content.ReadAsStringAsync().GetAwaiter(); dynamic updates = JsonConvert.DeserializeObject(content.GetResult()); }
解决方案
显式指定带字符集的ContentType
直接在ContentType中明确添加charset=utf-8,避免框架在特定环境下对编码名称的解析偏差:requestMessage.Content = new System.Net.Http.StringContent(json, Encoding.UTF8, "application/json; charset=utf-8");手动注册编码提供者
若服务器本地化配置异常,可能导致系统未正确注册UTF-8编码。可在程序启动时手动注册编码:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);注意需先安装
System.Text.Encoding.CodePagesNuGet包。优化重复调用问题
原代码中多次调用response.GetResult()属于冗余操作,建议缓存结果避免潜在风险:var result = response.GetResult(); if (result.StatusCode != System.Net.HttpStatusCode.OK) { throw new CDBAPIException($"Falha POST {result.StatusCode} - {result.ReasonPhrase}"); } var content = result.Content.ReadAsStringAsync().GetAwaiter(); dynamic updates = JsonConvert.DeserializeObject(content.GetResult());
内容的提问来源于stack exchange,提问作者Ferri16
相关产品推荐
相关产品推荐

