使用async await编写代码遇System.InvalidOperationException错误求助
解决"ISO-8859-2"编码不支持导致的InvalidOperationException异常
这个问题我之前也碰到过,本质是.NET默认的编码库没有包含ISO-8859-2(也就是Latin-2)这类非通用编码的支持,所以当你的异步代码尝试用这个字符集读取响应内容时,就会抛出你看到的System.InvalidOperationException和ArgumentException。
解决起来分两步:
安装编码扩展包
首先需要安装System.Text.Encoding.CodePagesNuGet包,这个包提供了.NET默认没有包含的大量编码支持,包括ISO-8859系列。- 如果用Visual Studio,可以通过NuGet包管理器搜索安装;
- 如果用命令行,.NET Core/.NET 5+执行:
dotnet add package System.Text.Encoding.CodePages; - 传统.NET Framework执行:
Install-Package System.Text.Encoding.CodePages
注册编码提供器
在你的代码启动的早期位置(比如Main方法开头,或者异步方法执行前),注册编码提供器,这样.NET就能识别ISO-8859-2编码了:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
给你一个修改后的完整异步代码示例:
using System; using System.Net.Http; using System.Text; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { // 先注册编码提供器,这一步必须在读取内容前执行 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); try { using var httpClient = new HttpClient(); var response = await httpClient.GetAsync("你的目标请求URL"); // 现在读取内容时就能正确识别ISO-8859-2编码了 var content = await response.Content.ReadAsStringAsync(); Console.WriteLine(content); } catch (Exception ex) { Console.WriteLine($"异常信息: {ex.Message}"); } } }
这样修改之后,你的代码应该就能正常读取使用ISO-8859-2编码的内容,不会再抛出那个异常了。
内容的提问来源于stack exchange,提问作者Karol Pisarzewski
相关产品推荐
相关产品推荐

