我正在按照 this 指南构建我的第一个带有 SignalR 触发器绑定的 Azure Function App。我已经在 Azure 中设置了 Function App 和 SignalR 服务。
但现在我需要调试我的 SignalR 触发函数之一。我正在尝试使用本地函数主机 (func.exe) 使用 Visual Studio 2022 来执行此操作,只需在我的 Azure Functions 项目中按 F5 即可。
我的 ServerlessHub 带有一个函数 JoinGroup,我想在 Visual Studio 中调用和调试它。
namespace FunctionApp
{
public class SimpleChat : ServerlessHub
{
[FunctionName("negotiate")]
public SignalRConnectionInfo Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest req)
{
var claims = GetClaims(req.Headers["Authorization"]);
return Negotiate(
claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value,
claims
);
}
[FunctionName(nameof(JoinGroup))]
public async Task JoinGroup([SignalRTrigger]InvocationContext invocationContext, string connectionId, string groupName)
{
throw new ApplicationException("CODE REACHED");
await Groups.AddToGroupAsync(connectionId, groupName);
}
}
}
我还用打字稿编写了一个简单的客户端,使用一个方法来调用我的 JoinGroup 函数:
testjoinGroup(){
if (this.isConnected()) {
this.hubConnection.invoke<any>("joinGroup", "testGroupName")
.then(x => console.log("success"))
.catch(err => console.log(err)):
}
}
连接创建成功,协商调用通过,上面的方法 testjoinGroup() 当我调用它时打印“成功”。但是,我没有在 Visual Studio 中达到断点。我的网络应用程序或 VS 中都没有收到任何错误。 我已配置“local.settings.json”以连接到我的 SignalR 实例。
我想做的事情根本不可能吗?我是否需要将更改部署到 Azure 才能测试新代码?
要在本地 Azure Functions 应用程序中调用和调试 SignalR 触发的函数,您需要配置两个关键方面:
将本地 Azure Function 暴露到 Internet:使您的本地 可通过互联网访问 Azure Function,您可以使用类似的工具 恩格罗克。该应用程序允许您在您的设备之间创建一条隧道 本地服务器(运行 Azure Function 的位置)和公共服务器 网址。这样,任何发送到公共 URL 的请求都将被转发 到您的本地环境,允许您测试和调试您的 在接近生产环境中运行。
在 Azure SignalR 中配置“上游端点”:一旦您的 Azure 功能可以通过隧道访问,您需要配置 Azure SignalR 服务中的上游端点。你可以从以下位置执行此操作 通过提供由以下方式生成的隧道的 URL 来访问 Azure 门户 恩格罗克。此配置将允许 Azure SignalR 发送消息 或通过隧道发送到本地 Azure Function 的事件 连接。
额外提示:请确保在测试和调试过程中保持 Ngrok 运行,因为如果 Ngrok 停止,隧道 URL 将变得不可用。
您可以在以下位置找到有关配置“上游端点”的文档:Azure SignalR 服务中的上游端点