gpt4 book ai didi

c# - 如何在 C# .NET Core 3.1 中使用网络套接字?

转载 作者:行者123 更新时间:2023-12-05 07:05:25 24 4
gpt4 key购买 nike

我正在尝试在我的网络应用程序中实现实时通知。只有我的网络应用程序中的管理员用户才能看到通知。
所以我在我的 startup.cs 文件中设置了网络套接字 我认为这不是正确的方式

启动.cs

var webSocketOptions = new WebSocketOptions()
{
KeepAliveInterval = TimeSpan.FromSeconds(120),
ReceiveBufferSize = 4 * 1024
};
app.UseWebSockets(webSocketOptions);
app.Use(async (context, next) =>
{
if (context.Request.Path == "/ws")
{
if (context.WebSockets.IsWebSocketRequest)
{
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

}
else
{
context.Response.StatusCode = 400;
}
}
else
{
await next();
}
});

这是我的 Javascript

window.onload = () => {
if (/*User is Admin*/) {

//Establish Websocket
var socket = new WebSocket("wss:localhost:44301/ws");

console.log(socket.readyState);

socket.onerror = function (error) {
console.log('WebSocket Error: ' + error);
};

socket.onopen = function (event) {
console.log("Socket connection opened")
};

// Handle messages sent by the server.
socket.onmessage = function (event) {
var data = event.data;
console.log(data);
//Draw some beautiful HTML notification
};
}
}

现在一切正常,但我不知道如何从我的服务器 Controller 发送消息,就像这样

[HttpGet]
public async Task<IActionResult> Foo(WebSocket webSocket)
{
//What I am trying to do is send message from the open web socket connection.
var buffer = new byte[1024 * 4];
buffer = Encoding.UTF8.GetBytes("Foo");

await webSocket.SendAsync(new ArraySegment<byte>(buffer),WebSocketMessageType.Text,true,CancellationToken.None);
return View()
}

我不知道如何处理这个问题。我想做的是,如果用户是管理员,打开网络套接字并从其他用户操作发送一些数据,(这意味着从我的一些 Controller 打开的网络套接字写入消息)

最佳答案

我在消息系统方面遇到了类似的问题。在 .NET CORE 中实现此目的的一种方法是使用 SIGNALR,因此您必须为要通信的每个用户创建连接。在您的情况下,每个用户都与管理员有联系。您应该在后端创建用于将此连接存储在哈希表中的类,以及一个实现发送方法的类。在 Startup.cs 我只有这个:

services.AddSignalR();
services.AddSingleton<ChatHub>();
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("AppSettings:Secret").Value)),
ValidateIssuer = false,
ValidateAudience = false
};
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];

// If the request is for our hub...
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments("/chat")))
{
// Read the token out of the query string
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});

ChatHub 是使用方法 send 和覆盖方法 OnConnectedAsyncOnDisconnectedAsync 扩展 Hub 的类,用于从哈希添加或删除连接。当你想发送消息时,你在前面提出请求。如果你想从你的 Controller 中做到这一点(如果你使用 JWT,这不是必需的)你只需要在你的 Controller 中注入(inject) ChatHub 如果你想要并调用发送消息。

ChatHub 中,这是重要的一行

await Clients.Client(connectionId).SendAsync("recievedMessage", messageToSend);

前面我用的是angular,所以代码不一样,请访问这个链接:c# SignalR .

关于c# - 如何在 C# .NET Core 3.1 中使用网络套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62756390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com