SignalR C# 客户端 Hubconnection.On 未触发
SignalR C# Client Hubconnection.On not fired
我有一个 ASPNet.Core WebApi,带有 signalR。我有 angular 应用程序,它使用 webAPI,我想用 Blazor Webassembly 应用程序替换它。我在 Blazor 应用程序中遇到 signalR 问题。
我创建一个hubconnection,设置它,当服务器发送数据时,Hubconnection.On方法没有被调用。这是我的代码:
protected override async Task OnInitializedAsync()
{
_hubConnection = new HubConnectionBuilder()
.WithUrl("https://localhost:45299/hubs/accounthub", cfg =>
{
cfg.SkipNegotiation = true;
cfg.AccessTokenProvider = () => Task.FromResult(token);
cfg.Transports = HttpTransportType.WebSockets;
})
.Build();
_hubConnection.On<IEnumerable<AccountResponse>>("accountschanged", (accounts) =>
{
foreach(var account in accounts)
{
Console.WriteLine(account.Name);
}
});
await _hubConnection.StartAsync();
}
在网络选项卡中,我看到连接正常,我收到了新数据,但 hubconnection.On 中的方法没有被触发。我仔细检查了方法名称,它是一样的。在 angular 应用程序中,它工作正常,当数据从服务器发送时,我认为服务器代码没有任何问题。
我使用 Fluxor 进行状态管理,并在 'On' 方法中触发一个动作,为了简单起见,我只是将其替换为单个 Console.WriteLine。
编辑:添加服务器代码,并收到消息
这是服务器代码,'AccountsChanged' 在更改帐户时调用:
public class AccountHub : Hub, IAccountHub
{
private readonly IHubContext<AccountHub> _accHub;
private readonly IAggregateMapper _mapper;
public AccountHub(IHubContext<AccountHub> accHub, IAggregateMapper mapper)
{
_accHub = accHub;
_mapper = mapper;
}
public async Task AccountsChanged(Guid userId, IEnumerable<Account> accounts)
{
var mapped = _mapper.MapAll<Account, AccountResponse>(accounts);
await _accHub.Clients.User(userId.ToString()).SendAsync("accountschanged", mapped);
}
}
这是我收到的消息(我向 Postman 发出请求),从网络选项卡中复制(为了简单起见,我删除了帐户的其他属性):
{
"type":1,
"target":"accountschanged",
"arguments":[
[
{
"id":1,
"name":"bank account 1"
},
{
"id":2,
"name":"wallet 1"
}
]
]
}
终于找到问题了。这是关于序列化收到的 json 消息。我必须添加 .AddJsonProtocol()
,并设置它,这是最终代码:
_hubConnection = new HubConnectionBuilder()
.WithUrl("http://localhost:59225/hubs/accounthub", cfg =>
{
cfg.SkipNegotiation = true;
cfg.Transports = HttpTransportType.WebSockets;
cfg.AccessTokenProvider = () => Task.FromResult(token);
})
.AddJsonProtocol(cfg =>
{
var jsonOptions = new System.Text.Json.JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
};
jsonOptions.Converters.Add(new JsonStringEnumConverter());
cfg.PayloadSerializerOptions = jsonOptions;
})
.Build();
顺便说一句,我没有收到任何错误消息,我觉得很奇怪。
我有一个 ASPNet.Core WebApi,带有 signalR。我有 angular 应用程序,它使用 webAPI,我想用 Blazor Webassembly 应用程序替换它。我在 Blazor 应用程序中遇到 signalR 问题。
我创建一个hubconnection,设置它,当服务器发送数据时,Hubconnection.On方法没有被调用。这是我的代码:
protected override async Task OnInitializedAsync()
{
_hubConnection = new HubConnectionBuilder()
.WithUrl("https://localhost:45299/hubs/accounthub", cfg =>
{
cfg.SkipNegotiation = true;
cfg.AccessTokenProvider = () => Task.FromResult(token);
cfg.Transports = HttpTransportType.WebSockets;
})
.Build();
_hubConnection.On<IEnumerable<AccountResponse>>("accountschanged", (accounts) =>
{
foreach(var account in accounts)
{
Console.WriteLine(account.Name);
}
});
await _hubConnection.StartAsync();
}
在网络选项卡中,我看到连接正常,我收到了新数据,但 hubconnection.On 中的方法没有被触发。我仔细检查了方法名称,它是一样的。在 angular 应用程序中,它工作正常,当数据从服务器发送时,我认为服务器代码没有任何问题。
我使用 Fluxor 进行状态管理,并在 'On' 方法中触发一个动作,为了简单起见,我只是将其替换为单个 Console.WriteLine。
编辑:添加服务器代码,并收到消息 这是服务器代码,'AccountsChanged' 在更改帐户时调用:
public class AccountHub : Hub, IAccountHub
{
private readonly IHubContext<AccountHub> _accHub;
private readonly IAggregateMapper _mapper;
public AccountHub(IHubContext<AccountHub> accHub, IAggregateMapper mapper)
{
_accHub = accHub;
_mapper = mapper;
}
public async Task AccountsChanged(Guid userId, IEnumerable<Account> accounts)
{
var mapped = _mapper.MapAll<Account, AccountResponse>(accounts);
await _accHub.Clients.User(userId.ToString()).SendAsync("accountschanged", mapped);
}
}
这是我收到的消息(我向 Postman 发出请求),从网络选项卡中复制(为了简单起见,我删除了帐户的其他属性):
{
"type":1,
"target":"accountschanged",
"arguments":[
[
{
"id":1,
"name":"bank account 1"
},
{
"id":2,
"name":"wallet 1"
}
]
]
}
终于找到问题了。这是关于序列化收到的 json 消息。我必须添加 .AddJsonProtocol()
,并设置它,这是最终代码:
_hubConnection = new HubConnectionBuilder()
.WithUrl("http://localhost:59225/hubs/accounthub", cfg =>
{
cfg.SkipNegotiation = true;
cfg.Transports = HttpTransportType.WebSockets;
cfg.AccessTokenProvider = () => Task.FromResult(token);
})
.AddJsonProtocol(cfg =>
{
var jsonOptions = new System.Text.Json.JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
};
jsonOptions.Converters.Add(new JsonStringEnumConverter());
cfg.PayloadSerializerOptions = jsonOptions;
})
.Build();
顺便说一句,我没有收到任何错误消息,我觉得很奇怪。