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