【问题标题】:Connecting to SignalR from React Native Expo app从 React Native Expo 应用程序连接到 SignalR
【发布时间】:2021-11-08 07:33:25
【问题描述】:

我正在尝试从一个新的 React Native Expo 应用程序连接到我的 SignalR 集线器,但我不断收到错误消息,但错误的性质尚不清楚,因为没有随错误提供的数据。

正如我所说,这是一个全新的 Expo 应用程序,所以代码非常简单:

import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr';

const connection = new HubConnectionBuilder()
  .withUrl('https://my-app.com/test-chat')
  .configureLogging(LogLevel.Information)
  .build();

async function start() {
  debugger;
  try {
    await connection.start();
    debugger;
    console.log('SignalR Connected.');
  } catch (err) {
    debugger;
    console.log(err);
    setTimeout(start, 5000);
  }
}

connection.onclose(async () => {
  await start();
});

// Start the connection.
start();

export default function App() {
  return (
    <View style={styles.container}>
      <Text>Hello World!</Text>
      <StatusBar style="auto" />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

这是我在控制台中看到的内容:

我在应用中用于 SignalR 的 npm 包是 "@microsoft/signalr": "^5.0.9"

这是我的test-chat hub 中的代码:

public class TestChat : Hub
{
    public override async Task OnConnectedAsync()
    {
        var connectionId = Context.ConnectionId;

        await Groups.AddToGroupAsync(connectionId, "test-chat");
        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        var connectionId = Context.ConnectionId;

        await Groups.RemoveFromGroupAsync(connectionId, "test-chat");
        await base.OnDisconnectedAsync(exception);
    }

    public async Task Send(string message)
    {
        await Clients.Groups("test-chat").SendAsync("new_message", message);
    }
}

我尝试在本地以调试模式连接。我还尝试在网络上的实际应用程序上连接到它。无论哪种方式,连接都失败了。我认为这可能是 CORS 问题,但我认为我们没有在移动应用的 CORS 设置中指定任何内容。

知道这里可能是什么问题吗?有没有人能够使用 React Native(Expo 与否)连接到 SignalR 集线器?

更新:我最初忘记提及的一个重要点是我正在使用 Azure SignalR。我的 Expo 客户端应用程序仍配置为访问我的 ASP.NET Core 后端上的集线器。

更新 2:首先,有一个 CORS 问题,因为我在我的 Windows 10 机器上使用 Android 模拟器对此进行了测试,我需要将 http://localhost:19000 添加到允许的来源。但第二个问题对我来说更重要:我确实使用 Azure SignalR 服务使事情变得更加可靠和可扩展,但这会产生问题。当我切换到只处理 ASP.NET Core 5 后端中的所有客户端连接时,它开始工作了。

【问题讨论】:

  • 好吧,虽然我不知道什么是“signalr”,但我现在已经使用 react-native 很多次了,我认为这个问题与此无关。 “CORS”例如跨源资源共享,是浏览器实现的标准,所以如果你从节点发出 HTTP 请求(例如 node-fetch 模块),它根本不受 CORS 约束。我建议先在浏览器中运行您的请求,然后找出问题所在。我几乎可以肯定你在寻找错误的地方,在 react-nativeexpo 中搜索问题。
  • “虽然错误的性质尚不清楚,因为没有提供错误的数据。”,有趣的是,根据库,它们包含错误信息。错误似乎是Error(例如,: 之后的错误消息部分)。大声笑。
  • 您在哪种模式下使用 Azure SignalR 服务?无服务器、默认还是经典?说切换回访问 asp.net core 5 后端的客户端连接意味着默认?你想使用无服务器吗?
  • 我正在使用默认模式,我的 ASP.NET Core 后端应用程序上有一个集线器。我正在尝试使用 Azure SignalR 服务来帮助管理所有客户端连接。据我了解,Azure SignalR 服务是可靠性和可扩展性的更好选择,这就是我选择使用它的原因。
  • 您的客户端仍然必须通过您的集线器连接到服务以发送/接收消息,这就是您的前端代码所做的事情。您是否在启动时设置了中心端点?您支持的 .net 核心应用程序不会给您更详细的错误吗? (如果它击中它)

标签: react-native expo signalr azure-signalr


【解决方案1】:

鉴于问题的性质以及对所涉及的库缺乏了解,我无法给你一个很好的答案,但我可以尝试为你指明正确的方向。

我已经找到了您的错误在库代码中发出的位置。那将是HttpConnection 类。它本身是用更熟悉的HubConnectionBuilder 构造的。

我建议在库代码中放置一个断点以进一步调试您的问题。关于here 将是一个不错的地方。这样做应该可以让您轻松检查用于创建请求的参数,并发现潜在的错误。

现在,您本地磁盘中的库代码在哪里?那么可能有两个位置。虽然我确定有人知道如何确定这一点,但我不知道。 “问题” 是该库公开了两种类型的模块。 cjs 文件夹和 esm 一个(技术上还有 browserwebworker,但我认为不太可能是其中之一)。现在您可能想知道这些文件夹代表什么,该模块的package.json 至少在一定程度上回答了这些问题。 cjs 代表“普通 js”,esm 代表“ES 模块”。无论如何......说到点子上......就像我说的我不知道react-native的捆绑器使用的是什么类型的模块(很可能你可以通过某种配置来配置它),所以我会老实说,首先将断点放在node_modules/@microsoft/signalr/dist/esm/HttpConnection.js 中,如果该断点没有命中,请尝试node_modules/@microsoft/signalr/dist/cjs/HttpConnection.js

给你。如果我可以提供任何进一步的帮助,请写评论! ?

【讨论】:

  • 感谢您尝试帮助解决此问题。到目前为止,我只能看到它无法启动连接。它一直在cjs\HttpConnection.js 中达到第 110 行。除此之外,我还不确定发生了什么。我认为我的集线器正在拒绝连接。我在OnConnectedAsync() 方法中设置了断点,但我没有点击它。
  • @Sam 你看开连接的参数了吗?我强烈怀疑它们不正确(或者服务器配置错误)。
  • 喜欢标题、凭据、网址等?
  • 啊,使用调试器向上调用堆栈,直到到达错误“错误”的实际来源。这肯定会给你更多的背景信息,我很想试试这个,但我只是没有设置。我认为创建某种可重现的回购并不容易?另外,您是否尝试过与普通 node.js 代码相同的方法?这将一劳永逸地消除react-native 的一些问题。
  • 这里有一个更新:首先,有一个 CORS 问题,因为我在我的 Windows 10 机器上使用 Android 模拟器对此进行了测试,我需要将 http://localhost:19000 添加到允许的来源。但是第二个问题对我来说更重要:我确实使用 Azure SignalR 服务来使事情变得更加可靠和可扩展,但这会产生一个问题。当我切换到只处理我的 ASP.NET Core 5 后端中的所有客户端连接时,它开始工作了。
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多