net 5.0 无法确定帧大小或收到损坏的帧

Thi*_*aud 19 c# .net-5

我想尝试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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

之后,我向邮递员尝试了相同的请求,并且成功了(与招摇一样)。我的最终测试是将控制台应用程序切换到 netcore 3.1 并且请求有效。

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

有什么建议 ?

编辑 :

  • 以下是我的电脑信息:W10 Enterprise、V 1809、Build 17763.1518。
  • 我只在 Net5.0 控制台上收到错误。

小智 17

我知道这是一个老问题,但我遇到了它并通过将 api url 部分中的“https”更改为“http”来解决它。

在这个问题中,情况将会发生变化:

var httpMessage = wait client.GetAsync("https://localhost:5001/WeatherForecast");

到:

var httpMessage = wait client.GetAsync("http://localhost:5001/WeatherForecast");

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (2认同)

小智 11

Kestrel 用于强制选择 Tls 1.1 或 Tls 1.2。从.Net 5.0 Preview 6开始,它被更改为“None”,意思是操作系统默认值。Kestrel 默认 TLS 支持

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

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client
Run Code Online (Sandbox Code Playgroud)

并设置或创建一个名为 的DisabledByDefaultDWORD 1

这将使您的浏览器支持 Tls 1.2。

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server
Run Code Online (Sandbox Code Playgroud)

另外,设置或创建一个名为 的DisabledByDefaultDWORD 1

如果这不起作用,请在客户端和服务器下创建一个名为“Enabled”的 DWORD,并将其设置为 0。这将完全禁用 Tls 1.3。


小智 9

异常的其他可能原因:
您的客户端调用 https url,但服务器仅托管 http。