我正在使用 signalR 制作一个项目,我想存储一些数据,例如:
Dictionary<string, string> UserAndConnectionId;
Run Code Online (Sandbox Code Playgroud)
如果用户断开连接并重新连接,他的connectionId将会改变,我想根据他的激活组设置他的界面。
所以,我创建了这个类:Hub 和一些函数:
public class MyClass: Hub
{
private Dictionary<MyFirstObject, List<MySecondObject>> _reference { get; set; }
private int _count;
[HubMethodName("onConnected")]
public override Task OnConnected()
{
Debug.WriteLine("OnConnected");
List<MySecondObject> userList;
_reference = new Dictionary<MyFirstObject, List<MySecondObject>>();
userList = new List<MySecondObject>();
userList.Add(new MySecondObject("userId", "userName", Context.ConnectionId));
_reference.Add(new MyFirstObject("groupName", null), userList);
_count++;
return base.OnConnected();
}
[HubMethodName("onDisconnected")]
public override Task OnDisconnected()
{
Debug.WriteLine("OnDisconnected");
return base.OnDisconnected();
}
[HubMethodName("onReconnected")]
public override Task OnReconnected()
{
Debug.WriteLine("OnReconnected");
return base.OnReconnected();
}
}
Run Code Online (Sandbox Code Playgroud)
显然,每个新客户端都会调用onConnected …
我需要使用 signalr 建立聊天,我是新手。
到目前为止,我只通过阅读其他一些代码和教程获得了聊天,这就是我得到的:
在我的 ChatApp.Hubs 上,我得到了以下代码
public static class UserHandler
{
public static HashSet<string> ConnectedIds = new HashSet<string>();
}
public class ChatHub : Hub
{
public void Send(string name, string message)
{
// Call the addNewMessageToPage method to update clients.
Clients.All.addNewMessageToPage(name, message);
}
public override Task OnConnected()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
UserHandler.ConnectedIds.Remove(Context.ConnectionId);
return base.OnDisconnected(stopCalled);
}
}
Run Code Online (Sandbox Code Playgroud)
我的观点是从教程中复制过去的
@{
ViewBag.Title = "Chat";
}
<h2>Chat</h2>
<div class="container">
<input type="text" id="message" />
<input type="button" id="sendmessage" …Run Code Online (Sandbox Code Playgroud) 我正在制作一个 1 对 1 聊天应用程序,我正在为此使用组。
你加入了一个组Groups.Add(Context.ConnectionId, roomName)。
每当发送消息时,我都想打电话
Clients.Group(roomName).addMessage(username, text);
Run Code Online (Sandbox Code Playgroud)
但为此我需要一个roomName变量。如何检索用户加入的房间?
I am making an application in Xamarin Forms that uses the Signalr service to implement a chat. The chat works perfectly in the UWP version and in the Android emulator, so it does when I am debugging on my phone (Android), but when I disconnect the phone from the PC the chaos begins. The problem is that I think that when the application goes to the background, it disconnects from the Signalr server.
我尝试过自动重新连接,甚至更改 ServerTimeout 和 KeepAliveInterval 的时间。但我没有成功。应该注意的是,我住的地方还有主要的连接问题,但我的理论仍然是应用程序进入后台时。
这是我初始化服务的代码(我使用的是单例服务)。
hubConnection …Run Code Online (Sandbox Code Playgroud) 我正在尝试向我的 SignalR 集线器添加安全/身份验证,但无论我尝试什么,客户端请求都会不断收到 403 - 禁止响应(尽管请求已成功通过身份验证)。
我的项目基于 Microsoft 的 SignalRChat 示例:
基本上我有一个带有 Razor Pages 的 ASP.Net Core Web 应用程序。该项目的目标是.Net Core 3.1。
使用的客户端库是 Microsoft 的 JavaScript 客户端库 v3.1.0。
我还参考了他们的安全方面的认证和授权文档:
https://learn.microsoft.com/en-us/aspnet/core/signalr/authn-and-authz?view=aspnetcore-3.1
关键区别在于,我没有使用 JWT Bearer 中间件,而是制作了自己的自定义令牌身份验证处理程序。
聊天.js:
"use strict";
var connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub", { accessTokenFactory: () => 'mytoken' })
.configureLogging(signalR.LogLevel.Debug)
.build();
//Disable send button until connection is established
document.getElementById("sendButton").disabled = true;
connection.on("ReceiveMessage", function (user, message) {
var msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
var encodedMsg = user …Run Code Online (Sandbox Code Playgroud) 去年我有一个信号中心,工作没有任何问题。今天,当尝试添加第二个集线器时,它不起作用。我已按照与第一个相同的步骤进行操作,但无济于事。
这是我的 ~/signalr/hubs 的输出
// Create hub signalR instance
$.extend(signalR, {
errorPageHub: {
_: {
hubName: 'Web.Infrastructure.Logging.Broadcasting.ErrorPageHub',
ignoreMembers: ['error', 'event', 'warning', 'success', 'namespace', 'ignoreMembers', 'callbacks'],
connection: function () { return signalR.hub; }
},
error: function (error, callback) {
return serverCall(this, "Error", $.makeArray(arguments));
},
event: function (eventDescription, callback) {
return serverCall(this, "Event", $.makeArray(arguments));
},
warning: function (warning, callback) {
return serverCall(this, "Warning", $.makeArray(arguments));
},
success: function (success, callback) {
return serverCall(this, "Success", $.makeArray(arguments));
}
},
pulsePageHub: {
_: {
hubName: 'Web.Infrastructure.Logging.Broadcasting.PulsePageHub', …Run Code Online (Sandbox Code Playgroud) 使用SignalR时,在HTML中需要引用以下两个脚本:
<script src="~/Scripts/jquery.signalR-1.0.0.js"></script>
<script src="/signalR/hubs"></script>
Run Code Online (Sandbox Code Playgroud)
第二个是用于自动生成的JavaScript集线器代理.一切正常.但是,如果以某种方式禁用JavaScript Hub Proxy生成会发生什么,可能是通过设置DisableJavaScriptProxies属性(https://github.com/SignalR/SignalR/commit/7e974f4e92551a26f3e3e0a166e1dbf6c064e850).禁用JavaScript代理生成并尝试在HTML中引用/ signalr/hubs时,会出现JavaScript错误:
Uncaught Error: SignalR: JavaScript Hub proxy generation has been disabled.
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中浏览到该路径时,响应为:
throw new Error('SignalR: JavaScript Hub proxy generation has been disabled.')
Run Code Online (Sandbox Code Playgroud)
如果禁用JavaScript代理生成,$.connection.myHub.clientJavaScript代码将如何工作?为了让它有效,还需要做些什么?我得到的JavaScript错误是
Uncaught TypeError: cannot read property 'client' of undefined.
Run Code Online (Sandbox Code Playgroud) 比方说,我有一个显示alert给所有用户的按钮.当我单击按钮时,所有连接的客户端都将看到alert.
让我们说这是通过从客户端调用服务器方法来完成的,客户端调用一个函数Client来显示警报.
例如:
public class DemoHub : Hub {
public void ShowAlert(String message) {
Clients.All.showAlertMessage(message);
}
}
Run Code Online (Sandbox Code Playgroud)
这是集线器中的服务器方法,它调用客户端功能以显示警报消息.
我的问题是,警报是否也会显示给当前客户?我的意思是,如果我点击按钮,在这种情况下我是否会看到警报?
注意:上面的场景不是真实场景,这只是我的问题的类似说明,因为我当前的场景解释起来相当复杂.
我想连接到SignalR Hub并使用Angular 4检索数据.如果您能为我提供如何实现此目的的示例,我将不胜感激.
signalr-hub ×9
signalr ×8
c# ×3
android ×1
angular ×1
asp.net-core ×1
asp.net-mvc ×1
store ×1
xamarin ×1