ContentType 中提供的字符集无效

Tom*_*ski 5 c# .net-core

我用 async await 写了一些简单的代码,但是当我尝试运行它时,编译器抛出一个System.InvalidOperationException.

完整的错误信息是:

未处理的异常:System.InvalidOperationException:ContentType 中提供的字符集无效。无法使用无效字符集将内容读取为字符串。

System.ArgumentException: 'ISO-8859-2' 不是受支持的编码名称。有关定义自定义编码的信息,请参阅 Encoding.RegisterProvider 方法的文档。

编码:

class Program
{
    static async Task Main(string[] args) => await asyncDoItAsync();

    private static async Task<string> asyncDoItAsync()
    {
        HttpClient client = new HttpClient(); 
        Task<string> url = client.GetStringAsync("http://google.pl");

        while(!url.IsCompleted)
        {
            WhenWaiting();
        }

        string url_length  = await url;

        return url_length;
    }

    private static void WhenWaiting()
    {
        Console.WriteLine("Waiting ...");
        Thread.Sleep(90);
    }
}
Run Code Online (Sandbox Code Playgroud)

ket*_*ura 9

在 .NET Core 中,默认情况下并非所有代码页都可用。 有关如何启用更多功能的详细信息,请参阅此处的答案。

基本上,从 Nuget 安装 System.Text.Encoding 和 System.Text.Encoding.CodePages 包,然后在运行任何 http 请求之前包含此行:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Run Code Online (Sandbox Code Playgroud)

  • 它在 .Net 6 项目上开箱即用,无需安装任何 Nuget。 (2认同)

小智 7

GetStringAsync 似乎在响应中不支持 iso-8859,并且基本上您对此无能为力。因此您需要从 GetAsync 开始。请务必清除现有的标头,否则它可能仍然会失败。以下适用于您提供的网址(尽管我使用的是 ISO-8859-1 而不是 2):

var client = new HttpClient();
client.DefaultRequestHeaders.Clear();
string s = null;
var result = await client.GetAsync("http://google.pl");
using (var sr = new StreamReader(await result.Content.ReadAsStreamAsync(), Encoding.GetEncoding("iso-8859-1")))
{
     s = sr.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)