【问题标题】:net 5.0 Cannot determine the frame size or a corrupted frame was receivednet 5.0 无法确定帧大小或收到损坏的帧
【发布时间】:2021-02-13 00:36:57
【问题描述】:

我想试试net5.0,因为它在rc2,我遇到了一个奇怪的问题。

我在 net5.0 中创建了一个默认的 WebApi。我没有碰任何东西,我只是点击了运行(在 kestrel 中,而不是 ISS 中),然后 Swagger 主页出现了。我尝试了 WeatherForcast get,一切正常。

然后我在 NET5.0 中创建了一个控制台应用程序并添加了以下代码:

static async Task Main(string[] args)
{
    var clientHandler = new HttpClientHandler
    {
        ServerCertificateCustomValidationCallback = (_, _, _, _) => true
    };
    var client = new HttpClient(clientHandler);
    try
    {
        var httpMessage = await client.GetAsync("https://localhost:5001/WeatherForecast");
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

使用此代码,我收到以下错误:

System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
---> System.IO.IOException: Cannot determine the frame size or a corrupted frame was received.

在那之后,我在 Postman 上尝试了相同的请求并且它成功了(来自 swagger)。 我的最终测试是将控制台应用程序切换到 netcore 3.1 并且请求有效。

所以我只在 net5.0 应用程序上遇到了这个错误。

有什么建议吗?

编辑:

  • 这是我的电脑信息:W10 Enterprise,V 1809,Build 17763.1518。
  • 我只在 Net5.0 控制台上得到了错误。

【问题讨论】:

  • 你的问题标题与它的内容有什么关系?
  • 不要使用.GetAwaiter().GetResult()。异步代码是异步的,不要试图强制它同步运行。
  • 你是说从 .NET 5 控制台应用程序调用 Web API 方法 https://localhost:5001/WeatherForecast only 失败,并从 .NET Core 3.1/Swagger 成功调用/邮递员?
  • 我的猜测是您正在点击github.com/dotnet/runtime/issues/1720 - 标记为已解决,并使用合并的代码进行修复,但不知道该修复是否已进入 RC2。如果您指定您正在使用的操作系统和版本,这也会有所帮助。
  • 我最好的猜测是您正在运行没有 TLS 的服务器,但正在尝试使用 https 进行连接。删除http。是的,正如上面@IanKemp 所说,请正确学习异步编程和线程。

标签: c# .net-5


【解决方案1】:

Kestrel 用于强制选择 Tls 1.1 或 Tls 1.2。从 .Net 5.0 Preview 6 开始,它被更改为“无”,这意味着操作系统默认值。 Kestrel Default Tls Support

巧合的是,微软去年开始在 Windows 10 中默认启用 Tls 1.3。Windows 10 Tls 1.3 Enabled by Default因此,您的应用程序现在很可能使用 Tls 1.3,我发现它有时“有问题”。

要将 Tls 1.3 设置为默认禁用(意味着对请求它的应用可用,否则关闭),请在注册表中转到或创建此路径:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client

并将名为DisabledByDefault 的DWORD 设置或创建为1

这应该让您的浏览器使用 Tls 1.2。

对于您的 Kestrel 服务器,类似地:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server

另外,将一个名为 DisabledByDefault 的 DWORD 设置或创建为 1

如果不这样做,在客户端和服务器下还创建一个名为“已启用”的 DWORD,设置为 0。这将完全禁用 Tls 1.3。

【讨论】:

  • 就是这样!非常感谢=)
猜你喜欢
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多