我正在使用在云中运行的 Azure SignalR 服务,并运行一个 Azure Function App,该应用程序在本地主机上的笔记本电脑上本地运行。 我有以下中心:
public class LeaderboardHub : ServerlessHub
{
[FunctionName("negotiate")]
public async Task<SignalRConnectionInfo> Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req) =>
Negotiate(req.Headers["x-ms-signalr-user-id"]);
[FunctionName(nameof(OnConnected))]
public async Task OnConnected([SignalRTrigger]InvocationContext invocationContext, ILogger logger)
{
logger.LogInformation($"{invocationContext.ConnectionId} has connected");
}
}
我像这样连接到我的集线器:
const apiBaseUrl = window.location.origin;
const connection = new signalR.HubConnectionBuilder()
.withUrl(apiBaseUrl + '/api')
.configureLogging(signalR.LogLevel.Information)
.build();
connection.start()
.catch(console.error);
当我运行此程序时,我可以在
Negotiate()
设置断点并查看所建立的连接。 当我向我的中心发送消息时,它们会显示在客户端上。 但是,我从未见过 OnConnected
方法被调用。 同样,如果我创建新的 SignalRTrigger
方法并在 Javascript 中调用它们,它们永远不会被调用。
我的理论:我希望我错了,但我有点猜测这是因为我在本地主机下的自己的笔记本电脑上运行我的应用程序,并且Azure SignalR服务无法“转发”消息由于 Azure 无法连接到我的笔记本电脑,因此请交给我。 我还没有尝试将我的函数应用程序部署到 Azure 并在那里运行它,但我猜测如果我在 Azure 中运行它,将会有双向连接。
谢谢!
:要使本地 Azure Function 能够通过 Internet 进行访问,您可以使用 Ngrok 等工具。此应用程序允许您在本地服务器(运行 Azure Function 的位置)和公共 URL 之间创建隧道。这样,发送到公共 URL 的任何请求都将转发到您的本地环境,从而允许您在接近生产环境中测试和调试您的功能。
:可通过隧道访问 Azure Function 后,您需要在 Azure SignalR 服务中配置上游端点。您可以通过提供 Ngrok 生成的隧道的 URL 从 Azure 门户执行此操作。此配置将允许 Azure SignalR 通过隧道连接向本地 Azure Function 发送消息或事件。
:将 Azure SignalR 连接到生产 Azure Function 时,您需要在上游端点中包含 API 密钥。端点应遵循以下格式:
https:///runtime/webhooks/signalr?code=。
可以从 Azure Function 键中检索
:在本地测试时,无需在上游端点中包含 API 密钥。相反,应该使用 Ngrok URL 配置上游端点,如下所示:
/runtime/webhooks/signalr.
这允许 Azure SignalR 通过 Ngrok 隧道与本地托管的 Azure Function 进行通信,而无需生产 API 密钥。
和Azure Function 和 Azure SignalR 无服务器模式集成中找到有关在 Azure SignalR 中配置“上游端点”的文档。
这样你不需要安装任何模拟器
,你只需要在Ngrok提供的公共URL和托管Azure Function的本地服务器(localhost:port)之间执行“转发”即可。 要查看有关 Azure SignalR 无服务器模式的更多文档,您可以查看以下链接: