SignalR Сообщение не отправляется - Angular - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь отправить сообщение, используя SignalR и Angular, но API никогда не попадает в серверную часть. Отсутствует код состояния, поэтому он никогда не попадает в конечную точку API. Соединение с концентратором устанавливается нормально, поэтому я бы подумал, что он автоматически попадает в конечную точку при выполнении this.hubConnection.invoke('NewMessage', message);, но, похоже, это не работает. Я новичок в SignalR, поэтому ценю любую помощь!

обмен сообщениями azure код функции

module.exports = async function (context, req) {
  return {
    "target": "newMessage",
    "arguments": [ req.body ]
  };
};

функция. json

{
  "disabled": false,
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "signalR",
      "name": "$return",
      "hubName": "chat",
      "direction": "out"
    }
  ]
}

angular сервис

import { Injectable, EventEmitter } from "@angular/core";
import * as signalR from "@aspnet/signalr";
import { SignalViewModel } from "./signal-view-model";

@Injectable({
  providedIn: "root"
})
export class SignalRService {
  private hubConnection: signalR.HubConnection;
  signalReceived = new EventEmitter<SignalViewModel>();

  constructor() {
    this.buildConnection();
    this.startConnection();
  }

  private buildConnection = () => {
    this.hubConnection = new signalR.HubConnectionBuilder()
      .withUrl("http://localhost:7070/api")
      .build();
  };
  sendMessage(message: SignalViewModel) {
    this.hubConnection.invoke('NewMessage', message);
  }
  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.signalReceived.emit(data);
    });
  }
}

angular компонент

 txtMessage: string = 'd';
  uniqueID: string = new Date().getTime().toString();
  messages = new Array<SignalViewModel>();
  signalRMessage = new SignalViewModel();
  sendMessage(): void {
    if (this.txtMessage) {
      console.log("Executing signalr")
      this.signalRMessage = new SignalViewModel();
      this.signalRMessage.clientuniqueid = this.uniqueID;
      this.signalRMessage.type = "sent";
      this.signalRMessage.message = this.txtMessage;
      this.signalRMessage.date = new Date();
      this.messages.push(this.signalRMessage);
      this.signalRService.sendMessage(this.signalRMessage);
      this.txtMessage = '';
    }

функция согласования


module.exports = async function (context, req, connectionInfo) {
  context.res.json(connectionInfo);
};

функция. json функция согласования

{
  "disabled": false,
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "signalRConnectionInfo",
      "name": "connectionInfo",
      "hubName": "chat",
      "direction": "in"
    }
  ]
}

1 Ответ

1 голос
/ 22 июня 2020

Проблема в том, что у вас есть "NewMessage" с заглавной «N» на стороне клиента и «newMessage» в функции.

module.exports = async function (context, req) {
  return {
    "target": "newMessage", // "n"
    "arguments": [ req.body ]
  };
};
 sendMessage(message: SignalViewModel) {
    this.hubConnection.invoke('NewMessage', message); // "N"
  }

Также обратите внимание на это документация о Azure Служба SignalR в бессерверном режиме. Как видите, если ваш хаб настроен на бессерверный режим, вы не можете вызывать методы из клиента.

Если вы используете Azure SignalR Service в бессерверном режиме, вы не можете вызывать хаб методы от клиента. Дополнительные сведения см. В документации по службе SignalR. Ссылка

Обновление : поскольку вы работаете над Azure функциями, и вам нужно запустить SignalR в бессерверном режиме, как вы можете видеть ниже, вы можете 'не вызывать методы концентратора от клиента.

...