【发布时间】:2018-09-14 06:37:30
【问题描述】:
我正在尝试从 this tutorial 开始将 Angular 4 + SPA 与 ASP.NET Core SignalR 集成。
我已经设法使用简单的 Web 应用程序(jquery + signalR 客户端)与 ASP.NET Core 应用程序集成,因此服务器端配置似乎没问题。
ASP.NET 核心
Microsoft.AspNetCore.SignalR 版本 1.0.0-alpha2-final
Startup.cs
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("chat");
});
ChatHub.cs
public class ChatHub: Hub
{
public void Send(string name, string message)
{
// Call the broadcastMessage method to update clients.
Clients.All.InvokeAsync("broadcastMessage", name, message + " from SignalR hub");
}
public override Task OnConnectedAsync()
{
Clients.All.InvokeAsync("broadcastMessage", "system", $"{Context.ConnectionId} joined the conversation");
return base.OnConnectedAsync();
}
public override Task OnDisconnectedAsync(System.Exception exception)
{
Clients.All.InvokeAsync("broadcastMessage", "system", $"{Context.ConnectionId} left the conversation");
return base.OnDisconnectedAsync(exception);
}
}
工作客户
我引用signalr-client-1.0.0-alpha2-final.js
// Web sockets do not work, most probably due to IIS Express I am using for testing
var transport = signalR.TransportType.LongPolling;
var connection = new signalR.HubConnection(`http://localhost:60431/chat`, { transport: transport });
connection.start();
这很好用。
Angular 4+ 客户端(不工作)
import { Component, OnInit } from '@angular/core';
import * as signalR from '@aspnet/signalr';
export class SignalrTestComponent implements OnInit {
private hubConnection: signalR.HubConnection;
ngOnInit() {
let transportType = signalR.TransportType.LongPolling;
this.hubConnection = new signalR.HubConnection('http://localhost:60431/chat', { transport: transportType });
this.hubConnection.start()
.then(() => {
console.log('Hub connection started')
})
.catch(() => {
console.log('Error while establishing connection')
});
}
我将收到“建立连接时出错”。该错误与客户端尝试访问 http://localhost:60431/chat/negotiate 的事实有关,这会返回错误的响应(一些虚拟文本与不正确的路由相关联,而不是预期的 JSON)。
我的假设是 transport 参数被忽略,因此触发了协商。但是,ASP.NET Core 版本的 SignalR 不再支持 AFAIK 协商。
package.json 可能相关的依赖项
"@angular/common": "^5.2.0",
"@angular/compiler": "^5.2.0",
"@angular/core": "^5.2.0",
"@angular/http": "^5.2.0",
"@angular/platform-browser": "^5.2.0",
"@angular/platform-browser-dynamic": "^5.2.0",
"@aspnet/signalr": "^1.0.0-preview1-update1",
问题:在使用 Angular2+ 客户端时,如何正确配置 HubConnection 以包含所需的协议?
【问题讨论】:
-
有没有可能你有一个
Chat Controller的路由到/Chat?如果没有,您可以将您的路线更改为routes.MapHub<ChatHub>("/chat"); //Notice the / <-- forward slash -
@12seconds - ASP.NET Core 应用程序不包含自定义控制器,我只有这条路线。工作测试使用
signalr-client-1.0.0-alpha2-final.js,我感觉到@aspnet/signalr": "^1.0.0-preview1-update1依赖存在问题。我将尝试使用以前的版本 (alpha2) 而不是preview1。 -
@12seconds -
http://localhost:60431/chat已正确解析,我收到错误http://localhost:60431/chat这是正常的(客户端必须提供连接 ID)。 -
我投票决定将此问题作为题外话结束,因为此问题是由一个问题引起的简单升级到预览版。 一个稳定的版本已经发布。虽然类似的问题可能是这里的主题,但这个问题的解决方式不太可能帮助未来的读者。
标签: angular asp.net-core-signalr