我已经在无服务器模式下创建了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函数一起工作。)
我将永远感谢任何帮助或指导。
谢谢
答案 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
Function_App_URL 可在 Function App 的概览页面上找到,API_KEY 由 Azure Function 生成。您可以在函数应用的应用密钥边栏的signalr_extension中获取API_KEY。
客户端:
connection.invoke("NotifyServerViaSignalR", additionalParameter);