C# Can';t连接托管在Azure Web App上的安全Asp.Net核心Web套接字(使用TLS)

C# Can';t连接托管在Azure Web App上的安全Asp.Net核心Web套接字(使用TLS),c#,azure,asp.net-core,websocket,tls1.2,C#,Azure,Asp.net Core,Websocket,Tls1.2,我花了一整天寻找解决办法,但我没有解决我的问题。正如您从标题中看到的,我使用Asp.NETCore(3.1)框架实现了一个基本的Web套接字,并将其部署在Azure(Web应用程序服务)上我成功地使其在没有TLS协议的情况下工作(因此我认为ws已以良好的方式配置),但当我尝试使用wss进行连接时,我在客户端收到以下错误: System.Net.WebSockets.WebSocketException : Unable to connect to the remote server System

我花了一整天寻找解决办法,但我没有解决我的问题。正如您从标题中看到的,我使用Asp.NETCore(3.1)框架实现了一个基本的Web套接字,并将其部署在Azure(Web应用程序服务)上我成功地使其在没有TLS协议的情况下工作(因此我认为ws已以良好的方式配置),但当我尝试使用wss进行连接时,我在客户端收到以下错误:

System.Net.WebSockets.WebSocketException : Unable to connect to the remote server
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.
System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
我试图在azure portal上切换“仅HTTPS”触发器,但它一直拒绝任何客户端连接。

你知道如何让wss与Azure Web App配合使用吗?我需要配置证书吗?我了解到,如果用户没有证书,azure会提供证书。谢谢和问候


更新:代码已从“复制”而来,可在git hub上访问。代码的重要部分如下所示:

/* THIS IS THE SERVER PART WHERE THE CONNECTION IS ACCEPTED */
namespace WebSocketServer.Middleware
{
    public class WebSocketServerMiddleware
    {
        private readonly RequestDelegate _next;

        private WebSocketServerConnectionManager _manager;

        public WebSocketServerMiddleware(RequestDelegate next, WebSocketServerConnectionManager manager)
        {
            _next = next;
            _manager = manager;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                await Receive(webSocket, async (result, buffer) =>
                {
                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        Console.WriteLine($"Receive->Text");
                        return;
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
                        return;
                    }
                });
            }
            else
            {
                await _next(context);
            }
        }
    }
}
/*这是客户端(用NET FULLFRAMEWORK编写)*/
控制台。写入(“连接…”);
var cts=新的CancellationTokenSource();
var socket=new ClientWebSocket();
字符串wsUri=”wss://testingwebsocket123123.azurewebsites.net";
wait socket.ConnectAsync(新Uri(wsUri)、cts.Token);
控制台写入线(套接字状态);
等待Task.Factory.StartNew(
异步()=>
{
var rcvBytes=新字节[1024*1024];
var rcvBuffer=新数组分段(rcvBytes);
while(true)
{
WebSocketReceiveResult rcvResult=等待套接字.ReceiveAsync(rcvBuffer,cts.Token);
字节[]msgBytes=rcvBuffer.Skip(rcvBuffer.Offset).Take(rcvResult.Count).ToArray();
string rcvMsg=Encoding.UTF8.GetString(msgBytes);
WriteLine(“接收:{0}”,rcvMsg);
}
},cts.Token,TaskCreationOptions.LongRunning,TaskScheduler.Default);

感谢您阅读

这些评论中没有提到的内容,它可以与中提供的javascript客户端配合使用。net客户机中的错误是由于使用完整框架从c#客户机连接时的TLS版本造成的。Azure web应用程序的屏幕截图强制执行min TLS 1.2。在.net客户端中设置,如下所示:

System.Net.ServicePointManager.SecurityProtocol |=SecurityProtocolType.Tls12;

您是否在WebApp中启用了Web套接字支持?是的,我启用了它,但没有wss,它可以正常工作。您可以共享与WebSocket支持相关的代码吗?我添加了git hub repository链接,并将相关部分复制并粘贴到此处。它可以与中提供的javascript客户端正常工作。我怀疑发生错误的原因是TLS版本,当您使用完整框架从c#客户端连接时。Azure web应用程序的屏幕截图强制执行min TLS 1.2。在.net客户端中进行如下设置:``System.net.ServicePointManager.SecurityProtocol |=SecurityProtocolType.Tls12```
/* THIS IS THE STARTUP FILE*/
public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddWebSocketServerConnectionManager();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseWebSockets();
        app.UseWebSocketServer();
    }
}
/* THIS IS THE CLIENT (WRITTEN IN NET FULLFRAMEWORK) */
Console.Write("Connecting....");
var cts = new CancellationTokenSource();
var socket = new ClientWebSocket();
string wsUri = "wss://testingwebsocket123123.azurewebsites.net";

await socket.ConnectAsync(new Uri(wsUri), cts.Token);
Console.WriteLine(socket.State);

await Task.Factory.StartNew(
    async () =>
    {
        var rcvBytes = new byte[1024 * 1024];
        var rcvBuffer = new ArraySegment<byte>(rcvBytes);
        while (true)
        {
            WebSocketReceiveResult rcvResult = await socket.ReceiveAsync(rcvBuffer, cts.Token);
            byte[] msgBytes = rcvBuffer.Skip(rcvBuffer.Offset).Take(rcvResult.Count).ToArray();
            string rcvMsg = Encoding.UTF8.GetString(msgBytes);
            Console.WriteLine("Received: {0}", rcvMsg);
        }
    }, cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);