我想尝试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 应用程序上遇到这个错误。
有什么建议 ?
编辑 :
小智 17
我知道这是一个老问题,但我遇到了它并通过将 api url 部分中的“https”更改为“http”来解决它。
在这个问题中,情况将会发生变化:
var httpMessage = wait client.GetAsync("https://localhost:5001/WeatherForecast");
到:
var httpMessage = wait client.GetAsync("http://localhost:5001/WeatherForecast");
小智 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。