如果连接未处于“已连接”状态,则无法发送数据

时间:2018-12-21 03:35:19

标签: angular typescript signalr angular6 signalr-hub

在Angular 6中使用SignalR做一个非常简单的调用来设置连接/停止,我有以下代码:

signalR.helper.ts

  public static setupHub<T>(hubUrl: string, eventName: string, callback: (data: T) => void, ...params: SignalRParam[]): HubConnection {
    const token = localStorage.getItem(appConstant.token);
    const url = this.buidlUrl(hubUrl, ...params);
    const connection = new HubConnectionBuilder()
        .withUrl(url,
            { transport: HttpTransportType.WebSockets, accessTokenFactory: () => token })
        .build();
    environment.production && connection.start();
    !environment.production && connection.start().catch(err => console.error(err.toString()));
    connection.on(eventName, callback);
    return connection;
}

如果我尝试登录我的页面,我会在控制台上不断收到此错误:

  

signalR.helper.ts:19错误:如果连接未处于“已连接”状态,则无法发送数据。

我是SignalR和Angular的新手,为什么我不断收到此错误?

2 个答案:

答案 0 :(得分:1)

在调用任何方法之前,请确保从“ .start()”返回的承诺已解决。您可能需要更改方法以返回诺言,以便可以将其他方法链接到该诺言。或切换到该方法中的使用异步/等待模式。

此外,请确保您没有意外调用“ .stop()”。就我而言,我有一个可观察的对象,它监视用户是否通过了身份验证,如果用户注销,则称为“ .stop()”。问题是,可观察到的内容表明,在页面加载过程中,用户暂时未经过身份验证-这导致了竞争状况,有时该页面有时会起作用,而有时则不会。

答案 1 :(得分:0)

请提供更多详细信息,例如您的Startup.cs或您在*.cshtml中添加以下行的位置:

<script src="~/lib/signalr/dist/browser/signalr.js"></script>
<script src="~/js/chat.js"></script>

如果您不导航到具有以上内容的*.cshtml页面,则SignalR将无法为您创建集线器。如果您希望它在整个Web应用程序中都可用,则将以上内容放入_Layout.cshtml

这将导致如下错误:

POST http://myserver.com/chatHub/negotiate 404 (Not Found)
(anonymous) @ XhrHttpClient.ts:84
XhrHttpClient.send @ XhrHttpClient.ts:30
Utils.ts:179 [2019-06-14T19:21:39.774Z] Error: Failed to complete negotiation with the server: Error: Not Found
ConsoleLogger.log @ Utils.ts:179
Utils.ts:179 [2019-06-14T19:21:39.774Z] Error: Failed to start the connection: Error: Not Found
Error: Cannot send data if the connection is not in the 'Connected' State.

有关更多详细信息,请参见:

概述: https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-2.2

集线器: https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-2.2

客户: https://docs.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-2.1#call-hub-methods-from-client