Angular 调用信号器失败
我正在尝试使用signalR从.net核心服务器(c#)向我的客户端(Angular)发送通知。在触发事件时通知客户端。但是我犯了一个错误。 错误:错误:由于服务器上的错误,无法调用“发送” Appcomponent.tsAngular 调用信号器失败,angular,asp.net-core,signalr,Angular,Asp.net Core,Signalr,我正在尝试使用signalR从.net核心服务器(c#)向我的客户端(Angular)发送通知。在触发事件时通知客户端。但是我犯了一个错误。 错误:错误:由于服务器上的错误,无法调用“发送” Appcomponent.ts ngOnInit(){ 此._hubConnection=new signal.HubConnectionBuilder() .configureLogging(信号器.LogLevel.Information) .withUrl(“http://localhost:5000
ngOnInit(){
此._hubConnection=new signal.HubConnectionBuilder()
.configureLogging(信号器.LogLevel.Information)
.withUrl(“http://localhost:5000/message/Send,此.transportType)
.build();
}
表格({
此._hubConnection.on(“发送”,(数据)=>{
const received=`message:${data}`;
控制台日志(已接收);
这是错误的;
});
此。_hubConnection.start()
.然后(()=>
这个._hubConnection.invoke('Send','hey')
.catch(函数(err){
console.error(err.toString());
})
)
.然后(()=>
console.log('connected'))
。然后(()=>此。_hubConnection.stop())
.然后(()=>console.log('Disconnected'))
.catch(e=>console.error(e.message));
}
信号枢纽
公共类数据集线器:集线器
{
公共异步任务Send1(字符串message1,字符串根)
{
等待Clients.All.sendsync(“Send1”,message1);
}
}
控制器
公共类数据控制器:控制器
{
私有IHubContext hubContext;
公共数据控制器(IHubContext hubContext)
{
_hubContext=hubContext;
}
提供的数据(数据和标题数据)上的私有无效
{
//服务器端代码
_hubContext.Clients.All.SendAsync(“发送”,数据);
}
}
Startup.cs
services.AddSignalR();
app.usesigner(路由=>
{
routes.MapHub(“/message/Send”);
});
错误记录
失败:Microsoft.AspNetCore.signal.Internal.DefaultHubDispatcher[8]
调用集线器方法“发送”失败。
System.IO.InvalidDataException:调用提供1个参数,但目标要求0。
位于Microsoft.AspNetCore.signar.Protocol.JsonHubProtocol.BindArguments(JArray args,IReadOnlyList`1 paramTypes)
位于Microsoft.AspNetCore.signal.Protocol.JsonHubProtocol.ParseMessage(Utf8BufferTextReader textReader,IInvocationBinder)
我想在事件中执行服务器端代码后调用signar连接来通知客户端。有人能给我引路吗。提前感谢。在客户机上调用的方法名称必须与在SignalR Hub中调用的方法名称相同(但也允许使用小写方法) 由于您的集线器方法被称为
Send1
,而您的客户端调用Send
,因此找不到该方法。要解决此问题,您可以将Hub方法重命名为Send
,或将客户端代码更改为调用this.\u hubConnection.invoke('send1',“hey”,“ho”)
以下是您要做的:
让客户端侦听名为this.\u hubConnection.on(“发送”…
的服务器事件Send
调用名为this.\u hubConnection.invoke('Send',“hey”)
的服务器方法。这不存在!服务器方法名为Send
Send1
声明一个名为public async Task Send1(string message1,string Root)
的方法。在您的客户端中,您没有任何地方试图调用Send1
,只有Send1
(没有Send
)1
如果要调用等待客户端.All.SendAsync(“Send1”,message1);
,您应该尝试向所有客户端发布Send1
消息。但是没有客户端正在侦听Send1
,只侦听Send1
Send
调用集线器方法“Send”失败。
它正在查找集线器方法Send
,但它不存在,因为您改为调用它Send1
快速修复:只需将所有出现的
Send1
重命名为Send
。因为这正是您试图在客户端上调用的。此外,您还必须使用两个参数来调用它,而不是当前的参数,因为hub方法有两个参数。在启动.cs
中,您应该注册signalR服务并如果尚未在http请求管道中映射中心,请将其映射到该管道
第一步
startup.cs-->ConfigureServices()
需要注册信号器服务,例如:
services.AddSignalR();
startup.cs-->Configure()
应包含您的映射,例如:
app.usesigner(路由=>
{
routes.MapHub(“/hub/test1”);
routes.MapHub(“/hub/test2”);
});
如果需要的话,可以添加更多选项。但我相信默认设置现在已经足够好了
步骤2
您的hub类可以简单地从:hub继承,以便测试正常工作。但要显示一些控制台输出,您可以覆盖虚拟hub函数,如下所示:
public类YourHubClass:Hub
{
公共覆盖异步任务OnConnectedAsync()
{
Console.WriteLine(Context.ConnectionId);
等待base.OnConnectedAsync();
}
公共覆盖异步任务OnDisconnectedAsync(异常示例)
{
Console.WriteLine(Context.ConnectionId);
等待基。OnDisconnectedAsync(ex);
}
}
步骤3
根据在后端代码中何时/何处通知正在侦听您的hub的所有客户端(或特定客户端),您只需执行以下操作即可发送要传输的数据
var test1data=GetTest1Data();
wait_hub.Clients.All.SendAsync(“test1”,test1data);
var test2data=GetTest1Data();
wait_hub.Clients.All.SendAsync(“test2”,test2data);
其中,\u hub
是在这个范围内注入的依赖项。只是澄清一下:
专用只读IHubContext\u hub;
公共YourScopedConstructor(IHubContext中心)
{
_hub=hub??抛出新的ArgumentNullException(nameof(hub));
}
步骤4
现在,您可以连接并收听集线器。例如:
public-yoursubscribebal