【问题标题】:Integrate Angular 4+ application with ASP.NET Core SignalR将 Angular 4+ 应用程序与 ASP.NET Core SignalR 集成
【发布时间】: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&lt;ChatHub&gt;("/chat"); //Notice the / &lt;-- 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


【解决方案1】:

好的,我在 project's github issue section 上获得了帮助。我的服务器端(ASP.NET Core SignalR)版本不是最新的,因此我遇到了问题:

  1. 升级到1.0.0-preview1-final

  2. 更改了服务器端代码以适应新版本(即修复编译错误):

    public class ChatHub: Hub
    {
        public void Send(string message)
        {
             // Call the broadcastMessage method to update clients.
             Clients.All.SendAsync("broadcastMessage", message + " from SignalR hub");
        }
     }
    

作为旁注,@latest 版本的客户端软件包与服务器端软件包并不完全相同:

预览 1 时 JavaScript 客户端出现小问题 已发布,需要更新,所以最新版本的 JavaScript 客户端是 1.0.0-preview1-update1,但服务器是 1.0.0-preview1-final。这些版本完全兼容。

【讨论】:

  • 我可以知道您在更新信号器之前遇到了什么错误吗?是“无法启动连接:TypeError:无法读取未定义的属性'长度'”?
  • @ArulManivannan - “'建立连接时出错”(在客户端)是错误。我没有时间关注这个,但现在看来他们终于发布了[@aspnet/signalr 的稳定版本](npmjs.com/package/@aspnet/signalr)。
【解决方案2】:

新的@aspnet/signalr 文档说要使用以下内容,而不是this.hubConnection.start()...

const url = 'http://www.something.com';

this.hubConnection = new signalR.HubConnectionBuilder()
  .withUrl(url)
  .build();

文档仍然很糟糕,但我在我的项目中使用它,希望这会有所帮助。

【讨论】:

  • 是的文档没有用,收到错误,无法启动连接:TypeError:无法读取未定义的属性“长度”。你克服了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
相关资源
最近更新 更多