4

我在 Angular6 中开发了一个项目。需要开发实时聊天部分。为此,我在我的 asp.net 核心 Web Apiproject 中使用 SignalR。现在我想在我的 Angular 项目中使用这个 Web Api 参考。

我正在使用这个链接。

但是在 App.Component.ts 中提供 Web Api url 时,我遇到了以下错误:

类“HubConnection”的构造函数是私有的,只能在类声明中访问。

应用组件.ts:

import { HubConnection } from '@aspnet/signalr';
import { Message } from 'primeng/api';

export class AppComponent implements OnInit {
  public _hubConnection: HubConnection;
  msgs: Message[] = [];
  constructor() {   
  }
  ngOnInit() {
    this._hubConnection = new HubConnection('http://localhost:1874/notify'); // getting error on this line.

编辑:尝试下面的代码: -

修改 App.Component.ts :

import { HubConnection } from '@aspnet/signalr';
import * as signalR from '@aspnet/signalr';
import { Message } from 'primeng/api';

export class AppComponent implements OnInit {
  public _hubConnection: HubConnection;
  msgs: Message[] = [];
  constructor() {   
  }
  ngOnInit() {       
    this._hubConnection = new signalR.HubConnectionBuilder()
          .withUrl('http://localhost:1874/notify')
          .configureLogging(signalR.LogLevel.Information)
          .build();

错误 :

无法加载 http://localhost:1874/notify/negotiate:对预检请求的响应未通过访问控制检查:响应中“Access-Control-Allow-Credentials”标头的值是“”,必须是当请求的凭据模式为“包含”时为“真”。因此,不允许访问源“ http://localhost:4200 ”。XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。

4

3 回答 3

5

他们更改了 SignalR Client 的构造函数,HubConnection不再允许您在客户端构造函数中传递路由,并将构造HubConnection函数设为私有以强制执行更改。相反,您需要使用HubConnectionBuilder如下:

new HubConnectionBuilder().withUrl("/YOURROUTEHERE").build();

您需要在标题中导入 HubConnectionBuilder,如下所示:

import { HubConnection, HubConnectionBuilder } from '@aspnet/signalr';

如果有帮助,我还刚刚发布了针对@aspnet/signalr 1.0.2、RxJs 5.5.6 和 Angular 6 的 RxSignalR 示例的更新。查看ReactiveChat 组件以获取示例。

于 2018-08-12T21:08:45.323 回答
1

在您的服务器代码中,您使用的是 CORS 吗?

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddCors(options => options.AddPolicy("CorsPolicy", builder =>
    {
        builder.AllowAnyMethod()
               .AllowAnyHeader()
               .WithOrigins("http://localhost:4200")
               .AllowCredentials();
    }));

    ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...

    app.UseCors("CorsPolicy");

    app.UseSignalR(routes =>
    {
        // your routes
    });

    ...
}
于 2018-07-01T11:38:02.487 回答
0

像这样试试

 private hubConnection: signalr.HubConnection;    
 message: string;
 ngOnInit() {
    this.hubConnection = new signalr.HubConnection('');

    this.hubConnection
      .start()
      .then(() => {
        console.log('Connection started!');
        this.hubConnection.on('ReceiveMessage', (message) => { 
          alert(message);
        });
      })
      .catch(err => console.log('Error while establishing connection :('));

  }
于 2018-07-11T08:06:28.543 回答