Angular 信号员未订阅内部角度服务

Angular 信号员未订阅内部角度服务,angular,signalr,azure-functions,Angular,Signalr,Azure Functions,我把我的信号机角度服务连接到后端。当我登录到我的应用程序时,我得到了我的访问令牌。我也可以发送消息并订阅我刚刚发送的消息,但我不能通过信号器订阅它。如果我打开了两个浏览器,并通过一个浏览器发送消息。门户信号器服务消息计数增加1,订阅方法从此行开始 this.http.post('http://localhost:7070/api/messages', message).pipe(takeUntil(this.destroy)).subscribe(data => console.log(

我把我的信号机角度服务连接到后端。当我登录到我的应用程序时,我得到了我的访问令牌。我也可以发送消息并订阅我刚刚发送的消息,但我不能通过信号器订阅它。如果我打开了两个浏览器,并通过一个浏览器发送消息。门户信号器服务消息计数增加1,订阅方法从此行开始

 this.http.post('http://localhost:7070/api/messages', message).pipe(takeUntil(this.destroy)).subscribe(data => console.log(data));
通过订阅中的console.log返回新消息。

但由于某些原因,我无法通过服务接收消息

当前,如果我将
test
指定为行为主体值:

private source=新行为主体(“测试”)

然后这一行在ngOnInit内部元件输出

this.signalRService.signalReceived.subscribe(data => console.log("Output:", data))

它从不返回新订阅的消息。这不是我所期望的,因为消息甚至没有进入服务

虽然这也值得注意,但我不能同时初始化测试。更多的是为了示范

因此,如果它被初始化为
private source=new BehaviorSubject(null)
组件控制台输出为
输出:null

如何让信号器服务返回该值?它使用的是来自的azure功能代码,并且能够毫无问题地连接到文章中的示例聊天应用程序

它也可以通过示例应用程序在两个不同的浏览器之间接收消息,因此我认为它与客户端的关系比后端的关系更大,因为这个测试是有效的。我已经在这上面呆了一段时间了,所以我非常感谢任何帮助

信号员业务

import { Injectable, EventEmitter, OnDestroy, Output } from "@angular/core";
import * as signalR from "@microsoft/signalr";
import { SignalViewModel } from "./signal-view-model";
import { HttpClient, HttpParams } from "@angular/common/http";
import { BehaviorSubject, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

@Injectable({
  providedIn: "root"
})

export class SignalRService implements OnDestroy {
  @Output() onSignalRMessage: EventEmitter<any> = new EventEmitter();
  private hubConnection: signalR.HubConnection;
  private source = new BehaviorSubject(null);
  signalReceived = this.source.asObservable();
  destroy = new Subject();
  constructor(private http: HttpClient) {
    this.buildConnection();
    this.startConnection();
  }

  private buildConnection = () => {
    this.hubConnection = new signalR.HubConnectionBuilder()
      .withUrl("http://localhost:7070/api")
      .build();
  }

  sendMessage(message: SignalViewModel) {
    this.http.post('http://localhost:7070/api/messages', message).pipe(takeUntil(this.destroy)).subscribe(data => console.log(data));
  }

  private startConnection = () => {
    this.hubConnection
      .start()
      .then(() => {
        console.log("Connection Started...");
        this.registerSignalEvents();
      })
      .catch(err => {
        console.log("Error while starting connection: " + err);

        //if you get error try to start connection again after 3 seconds.
        setTimeout(function () {
          this.startConnection();
        }, 3000);
      });
  }

  private registerSignalEvents() {
    this.hubConnection.on("SignalMessageReceived", (data: SignalViewModel) => {
      this.source.next(data)
    });
  }

  private newMessage(data: SignalViewModel) {
    this.onSignalRMessage.emit(data);
  }


  getSignalReceived() {
    return this.signalReceived;
  }

  ngOnDestroy() {
    this.destroy.next();
    this.destroy.complete();
  }

}

从“@angular/core”导入{可注入、事件发射器、OnDestroy、输出};
从“@microsoft/signalR”导入*作为信号器;
从“/signal view model”导入{SignalViewModel};
从“@angular/common/http”导入{HttpClient,HttpParams};
从'rxjs'导入{BehaviorSubject,Subject};
从“rxjs/operators”导入{takeUntil};
@注射的({
提供于:“根”
})
导出类SignalRService实现OnDestroy{
@信号rMessage上的输出():EventEmitter=新的EventEmitter();
专用hubConnection:signal.hubConnection;
private source=new BehaviorSubject(null);
signalReceived=this.source.asObservable();
销毁=新主题();
构造函数(专用http:HttpClient){
这个.buildConnection();
this.startConnection();
}
私有构建连接=()=>{
this.hubConnection=new signal.HubConnectionBuilder()
.withUrl(“http://localhost:7070/api")
.build();
}
sendMessage(消息:SignalViewModel){
this.http.post('http://localhost:7070/api/messages管道(takeUntil(this.destroy)).subscribe(data=>console.log(data));
}
专用startConnection=()=>{
这是hubConnection
.start()
.然后(()=>{
log(“连接已启动…”);
this.registerSignalEvents();
})
.catch(错误=>{
log(“启动连接时出错:+err”);
//如果出现错误,请尝试在3秒钟后再次启动连接。
setTimeout(函数(){
this.startConnection();
}, 3000);
});
}
专用注册表项(){
this.hubConnection.on(“SignalMessageReceived”,(数据:SignalViewModel)=>{
this.source.next(数据)
});
}
专用新消息(数据:SignalViewModel){
this.onSignalRMessage.emit(数据);
}
getSignalReceived(){
返回此文件。已收到;
}
恩贡德斯特罗(){
this.destroy.next();
this.destroy.complete();
}
}
我在使用另一篇文章中的代码,我没有意识到可观察到的答案改变了主题名称或其他内容。不知道为什么EventEmitter的方式不起作用,但一旦我将它调整为
newMessage
它就开始起作用了

 private registerSignalEvents() {
    this.hubConnection.on("SignalMessageReceived", (data: SignalViewModel) => {
      this.source.next(data)
    });


你能发布你的组件代码吗?听起来,在注入服务时,您可能会得到一个不同的服务实例。我不认为这是组件的问题。如果我将一个
console.log(data)
放在
this.source.next(data)
内部信号器服务方法
private registerSignalEvents()
的正上方,那么它永远不会输出。如果我打开另一个浏览器,并在第一个浏览器中使用console.log登录服务进行竞价,那么我在第二个浏览器中就看不到这一点。再读一遍,我认为它也没有问题。我认为您可能会提供一个单独的服务实例,但如果您是,您可能会得到双倍的值,因为每个服务都会侦听和响应事件。正确。由于某些原因,目前无法以除http.post subscribe之外的任何其他方式检索新消息。因此,只有发送消息的同一实例才能看到消息TechnicallyId您是否尝试使用
EventEmitter
  private registerSignalEvents() {
    this.hubConnection.on("NewMessage", (data: SignalViewModel) => {
      this.source.next(data)
    });