使用 Azure SignalR 服务和 Azure Functions 进行本地开发

问题描述 投票:0回答:2

我正在使用在云中运行的 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 中运行它,将会有双向连接。

  1. 这是一个正确的假设吗? 意思是,这是 Azure SignalR 服务的限制吗?
  2. 有什么办法可以解决这个问题吗? 例如,运行一些本地 AzureR SignalR 代理服务或模拟器? 人们通常如何使用 SignalR 进行开发而不将每一个小更改都部署到 Azure?

谢谢!

c# .net azure azure-functions signalr
2个回答
5
投票

解决了我自己的问题! 首先,我是对的。 其次,有一个非常酷的 SignalR 本地模拟器,可以在这里找到:

https://github.com/Azure/azure-signalr/blob/dev/docs/emulator.md

安装并运行后,我的代码按预期完美运行。


0
投票
要在本地 Azure Functions 应用程序中调用和调试 SignalR 触发的函数,您需要配置两个关键方面:

  1. 将本地 Azure Function 暴露到 Internet

    :要使本地 Azure Function 能够通过 Internet 进行访问,您可以使用 Ngrok 等工具。此应用程序允许您在本地服务器(运行 Azure Function 的位置)和公共 URL 之间创建隧道。这样,发送到公共 URL 的任何请求都将转发到您的本地环境,从而允许您在接近生产环境中测试和调试您的功能。

  2. 在 Azure SignalR 中配置“上游端点”

    :可通过隧道访问 Azure Function 后,您需要在 Azure SignalR 服务中配置上游端点。您可以通过提供 Ngrok 生成的隧道的 URL 从 Azure 门户执行此操作。此配置将允许 Azure SignalR 通过隧道连接向本地 Azure Function 发送消息或事件。

    • 对于生产

      :将 Azure SignalR 连接到生产 Azure Function 时,您需要在上游端点中包含 API 密钥。端点应遵循以下格式: https:///runtime/webhooks/signalr?code=。 可以从 Azure Function 键中检索 ,此场景的推荐键是名为 signalr_extension 的键。此键应用于完成上游端点 URL。您可以在 Azure 门户中 Azure 功能的“功能键”部分下找到此 API 密钥。

    • 对于本地开发

      :在本地测试时,无需在上游端点中包含 API 密钥。相反,应该使用 Ngrok URL 配置上游端点,如下所示: /runtime/webhooks/signalr. 这允许 Azure SignalR 通过 Ngrok 隧道与本地托管的 Azure Function 进行通信,而无需生产 API 密钥。

  3. 您可以在
Azure SignalR 服务中的上游端点

Azure Function 和 Azure SignalR 无服务器模式集成中找到有关在 Azure SignalR 中配置“上游端点”的文档。


额外提示:请确保在测试和调试过程中保持 Ngrok 运行,因为如果 Ngrok 停止,隧道 URL 将变得不可用。

这样你不需要安装任何模拟器

,你只需要在Ngrok提供的公共URL和托管Azure Function的本地服务器(localhost:port)之间执行“转发”即可。 要查看有关 Azure SignalR 无服务器模式的更多文档,您可以查看以下链接:

    Azure SignalR 服务模式(请参阅无服务器模式)
  • 问题:我可以将消息从客户端发送到服务器方法中心吗 无服务器模式?
  • .

© www.soinside.com 2019 - 2024. All rights reserved.