SignalR HubConnection无法从无服务器Azure SignalR服务接收消息

时间:2019-11-22 15:27:07

标签: c# azure azure-functions signalr-hub

我已经在无服务器模式下创建了Azure SignalR服务。我在Azure Function应用程序中具有一套功能来管理必须包含组的聊天服务。发布功能应用程序时,我将AzureSignalRConnectionString设置为SignalR服务中“键”设置下的设置。我已经在Azure门户中再次检查了连接字符串是否存在并且正确。

我可以使用Postman成功调用Azure中的各个功能,并可以在Azure门户中对其进行监视并查看日志消息等。

但是,如果我在客户端中使用HubConnection尝试调用一个函数,它将无法到达该位置。另外,邮递员成功发送的邮件不会导致集线器触发收据。

因此可以看到使用REST接口的以下调用是从Azure门户执行的:

await client.PostAsync($"{baseUrl}/api/{group}/add/{userName}", new StringContent(string.Empty));

但是,以下使用HubConnection的调用不会触发相同的Azure函数:

await hubConnection.SendAsync("AddToGroup", group, userName);

此功能的绑定是:

[FunctionName("AddToGroup")]
public static async Task<IActionResult> Run(
    [HttpTrigger(
    AuthorizationLevel.Anonymous, 
    "post", 
    Route = "{groupName}/add/{userId}")] 
    HttpRequest req,
    string groupName,
    string userId,
    [SignalR(HubName = Constants.HubName)]
    IAsyncCollector<SignalRGroupAction> signalRGroupActions,
    ILogger log)
{
    log.LogInformation("AddToGroup invoked");

    await signalRGroupActions.AddAsync(
    new SignalRGroupAction
    {
        UserId = userId,
        GroupName = groupName,
        Action = GroupAction.Add
    });

    return new OkObjectResult("All done");
}

功能应用程序包含一个协商功能,该功能用于初始化集线器连接,如下所示:

var negotiateJson = await client.GetStringAsync($"{baseUrl}/api/negotiate");
var info = JsonConvert.DeserializeObject<NegotiateInfo>(negotiateJson);
hubConnection = new HubConnectionBuilder()
    .WithUrl(info.Url, options =>
    {
        options.AccessTokenProvider = () => Task.FromResult(info.AccessToken);
    })
    .Build();

调试后,显示网址正确无误,并且存在访问令牌。

我正在使用Microsoft.AspNetCore.SignalR.Client V3.0.0,并遵循了许多指南和示例,但无法使Azure SignalR集线器正常工作。

(过去我曾与托管的SignalR一起工作,发现它很简单,但以前没有与Azure服务或Azure函数一起工作。)

我将永远感谢任何帮助或指导。

谢谢

2 个答案:

答案 0 :(得分:1)

Azure SignalR服务+ Azure功能当前不支持通过SignalR从客户端向服务发送消息。 The same is documented as well

相反,您将必须直接从客户端发出HTTP请求。

此外,如果需要,您可以使用ASP.NET Core with Azure SignalR代替Azure Functions来实现您想要的目的。

答案 1 :(得分:1)

Azure SignalR 服务 + Azure Functions 支持通过 SignalR 从客户端向服务发送消息(使用 ASP.NET CORE)

服务器端(传统模型):

[FunctionName("notifyServerViaSignalR")]
public async Task NotifyServerViaSignalR([SignalRTrigger("YourHub", "messages", "NotifyServerViaSignalR")]
InvocationContext invocationContext, [SignalRParameter] string additionalParameter, ILogger logger)
{
    logger.LogInformation($"Processed NotifyServerViaSignalR - AdditionalParameter:{additionalParameter} from ConnectionId:{invocationContext.ConnectionId}.");
}

还要在 Azure SignalR 设置中配置上游 URL

/runtime/webhooks/signalr?code=

Function_App_URL 可在 Function App 的概览页面上找到,API_KEY 由 Azure Function 生成。您可以在函数应用的应用密钥边栏的signalr_extension中获取API_KEY。

客户端:

connection.invoke("NotifyServerViaSignalR", additionalParameter);