【发布时间】: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-native或expo中搜索问题。 -
“虽然错误的性质尚不清楚,因为没有提供错误的数据。”,有趣的是,根据库,它们包含错误信息。错误似乎是
Error(例如,:之后的错误消息部分)。大声笑。 -
您在哪种模式下使用 Azure SignalR 服务?无服务器、默认还是经典?说切换回访问 asp.net core 5 后端的客户端连接意味着默认?你想使用无服务器吗?
-
我正在使用默认模式,我的 ASP.NET Core 后端应用程序上有一个集线器。我正在尝试使用 Azure SignalR 服务来帮助管理所有客户端连接。据我了解,Azure SignalR 服务是可靠性和可扩展性的更好选择,这就是我选择使用它的原因。
-
您的客户端仍然必须通过您的集线器连接到服务以发送/接收消息,这就是您的前端代码所做的事情。您是否在启动时设置了中心端点?您支持的 .net 核心应用程序不会给您更详细的错误吗? (如果它击中它)
标签: react-native expo signalr azure-signalr