Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 调用信号器失败_Angular_Asp.net Core_Signalr - Fatal编程技术网

Angular 调用信号器失败

Angular 调用信号器失败,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

我正在尝试使用signalR从.net核心服务器(c#)向我的客户端(Angular)发送通知。在触发事件时通知客户端。但是我犯了一个错误。 错误:错误:由于服务器上的错误,无法调用“发送”

Appcomponent.ts

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