SignalR 与 Angular 10 和 ASP.NET

Mys*_*Blu 8 asp.net signalr signalr-hub angular

我正在尝试在 ASP.NET(不是 Core)和 Angular(当前为 10)应用程序中实现 SignalR。Startup.cs 使用 Owin。

我能找到的每个文档或示例要么适用于 ASP.NET Core,要么没有使用 Angular,所以有人可以为我指出一个好的方向吗?

我能找到的最接近这个组合的是这个指南: https: //www.c-sharpcorner.com/article/asp-net-signalr-angular2-and-typescript-real-time-clock/,但是我不断得到“无法读取未定义的属性“hubConnection””错误,可能是因为自从我开始使用 Angular 7 及更高版本以来,我不明白“$”在 SignalRService 类中做什么。

任何帮助将不胜感激。

Jek*_*Jek 10

您可以使用此链接中的示例SignalR using Angular 10

脚步:

  1. 安装所需的信号器库

npm 我@microsoft/signalr@latest --save

  1. 导入需要的类

从 '@microsoft/signalr' 导入 { HubConnection, HubConnectionBuilder, LogLevel };

  1. 连接到集线器
this._hubConnection = new HubConnectionBuilder()
  .withUrl('http://localhost:52864/chathub')
  .build();
Run Code Online (Sandbox Code Playgroud)
  1. 监听集线器上的方法
this._hubConnection.on('MessageReceived', (message) => {
  console.log(message);
});
Run Code Online (Sandbox Code Playgroud)
  1. 开始连接
this._hubConnection.start()
  .then(() => console.log('connection started'))
  .catch((err) => console.log('error while establishing signalr connection: ' + err));
Run Code Online (Sandbox Code Playgroud)

虚拟示例如下所示:

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { HubConnection, HubConnectionBuilder, LogLevel } from '@microsoft/signalr';

@Component({
  selector: 'app-messaging',
  templateUrl: './messaging.component.html',
  styleUrls: ['./messaging.component.scss']
})
export class MessagingComponent implements OnInit {
  private _hubConnection: HubConnection;

  constructor(private _httpClient: HttpClient) { }

  ngOnInit(): void {
    this.connect();
  }

  public onSendButtonClick(): void {
    this._hubConnection.send('SendMessage', 'test message').then(r => { });
  }

  private connect(): void {
    this._hubConnection = new HubConnectionBuilder()
      .withUrl('http://localhost:52864/chathub')
      .build();

    this._hubConnection.on('MessageReceived', (message) => {
      console.log(message);
    });

    this._hubConnection.start()
      .then(() => console.log('connection started'))
      .catch((err) => console.log('error while establishing signalr connection: ' + err));
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:无需安装“signalr-protocol-msgpack”


She*_*iny 3

旧的(非核心)SignalR javascript 客户端依赖于 jQuery。因此,在 Angular 应用程序中添加对 SignalR 支持的最佳方法是首先

  1. 将 jquery 和 signalr npm 包添加到您的项目中

    npm 安装 jquery signalr --save

  2. 添加 @types/jquery 和 @types/signalr npm 包,以支持这两个包的输入。

    npm install @types/jquery @types/signalr --save-dev

  3. 编辑 angular.json 文件projects/[projectname]/architect/build/scripts 节点以包含 jquery 和 signalr 脚本(请参阅下面的完整文件示例)

    “脚本”:[“./node_modules/jquery/dist/jquery.min.js”,“./node_modules/signalr/jquery.signalR.js”]

  4. 编辑 tsconfig.app.json 文件并将“jquery”、“signalr”添加到“compilerOptions”/“types”列表中。(请参阅下面的完整文件示例)

这是 angular.json 的样子(这里的项目名称是 signalr demo)

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "signalrdemo": {
      "projectType": "application",
      "schematics": {},
      "root": "",
      "sourceRoot": "src",
      "prefix": "app",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/signalrdemo",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.app.json",
            "aot": true,
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.css"
            ],
            "scripts": [
              "./node_modules/jquery/dist/jquery.min.js",
              "./node_modules/signalr/jquery.signalR.js"
            ]
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "2mb",
                  "maximumError": "5mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb",
                  "maximumError": "10kb"
                }
              ]
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "signalrdemo:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "signalrdemo:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "signalrdemo:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.spec.json",
            "karmaConfig": "karma.conf.js",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.css"
            ],
            "scripts": []
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "tsconfig.app.json",
              "tsconfig.spec.json",
              "e2e/tsconfig.json"
            ],
            "exclude": [
              "**/node_modules/**"
            ]
          }
        },
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "signalrdemo:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "signalrdemo:serve:production"
            }
          }
        }
      }
    }},
  "defaultProject": "signalrdemo"
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.app.json 应该是这样的:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/app",
    "types": ["jquery","signalr"]
  },
  "files": [
    "src/main.ts",
    "src/polyfills.ts"
  ],
  "include": [
    "src/**/*.d.ts"
  ]
}
Run Code Online (Sandbox Code Playgroud)