Azure SignalR InvokeAsync在尝试建立组连接时挂起
在连接上调用InvokeAsync挂起 我正在引用以下内容来配置Azure Signal中的组连接 注: 我只能在不依赖组配置的情况下建立连接 客户端:Azure SignalR InvokeAsync在尝试建立组连接时挂起,signalr,azure-signalr,Signalr,Azure Signalr,在连接上调用InvokeAsync挂起 我正在引用以下内容来配置Azure Signal中的组连接 注: 我只能在不依赖组配置的情况下建立连接 客户端: var negotiateJson = await _client.GetStringAsync($"{host}{"negotiatefn"}"); var negotiate = JsonConvert.DeserializeObject<NegotiateInfo>(negoti
var negotiateJson = await _client.GetStringAsync($"{host}{"negotiatefn"}");
var negotiate = JsonConvert.DeserializeObject<NegotiateInfo>(negotiateJson);
var connection = new HubConnectionBuilder()
.AddNewtonsoftJsonProtocol()
.WithUrl(negotiate.Url, options => options.AccessTokenProvider = async () => negotiate.AccessToken)
.Build();
connection.Closed -= Connection_Closed;
connection.Closed += Connection_Closed;
connection.On<JObject>(hubMethodName, OnCourierUpdate);
await connection.StartAsync();
await connection.InvokeAsync("JoinGroup", sessionId); // HANGS APP HERE !!!
来自Azure SignalR团队的即时消息,您的服务正在无服务器模式下运行,它不允许任何服务器连接,您的F#hub如何运行 在客户端,
connection.InvokeAsync
需要服务器确认,因为服务器连接无法连接,所以无法从服务获取任何确认
如果您需要集线器服务器,请将服务切换到默认
模式,然后使用Azure SignalR SDK运行集线器,并验证服务器是否已连接(通过服务度量中的日志或连接计数)
如果需要无服务器集线器,请删除集线器,您可以在功能端添加无服务器集线器,请参阅:。
别忘了设置上游,请参见:。老实说,我唯一一次看到应用程序挂起是在服务器无法访问时。你确定url是正确的吗?或者,如果服务器是通过https托管的,那么ssl证书是有效的。我相信URL是正确的,因为我可以在没有组配置的情况下成功演示连接。这看起来有点混乱。您使用的是Azure函数还是信号器库?看起来你在服务器端混合了这两种功能?@davidfoll我两者都用。因此,当前的问题是无效的,新问题是使用无服务器集线器,对吗?这是一个受支持的场景,这个问题以一种不受支持的方式混合了它们。我能够在没有组配置的情况下在客户端和服务器之间建立连接。是的,您可以连接客户端,因为您使用函数来处理协商,它重定向到服务。但是,该中心不起作用。如果您在function app中编写hub,则函数对hub一无所知,它将被视为普通类,没有人使用它。如果您在另一个应用程序服务中写入中心,并使用Azure SignalR SDK,服务器连接将被拒绝,因为您的服务处于无服务器模式。我认为您在服务中保留上游为空,这将导致服务始终忽略来自客户端的所有消息。
public static class LocationFn
{
[FunctionName(nameof(LocationFn))]
public static async Task<IActionResult> Run(
[HttpTrigger(
AuthorizationLevel.Anonymous,
"post",
Route = nameof(LocationFn))]
HttpRequest req,
[SignalR(HubName = "LocationHub")]
IAsyncCollector<SignalRMessage> signalRMessages,
ILogger log)
{
log.LogInformation($"{nameof(LocationFn)} has been invoked.");
try
{
using (var streamReader = new StreamReader(req.Body))
{
var json = await streamReader.ReadToEndAsync();
var subjectLocation = JsonConvert.DeserializeObject<SubjectLocation>(json);
await signalRMessages.AddAsync(
new SignalRMessage
{
Target = "LocationUpdate",
GroupName = subjectLocation.SessionId,
Arguments = new[] { subjectLocation }
});
var message = Log(log, subjectLocation);
return new OkObjectResult(message);
}
}
catch (Exception ex)
{
return new BadRequestObjectResult("There was an error: " + ex.Message);
}
}
}
public static class JoinGroupFn
{
[FunctionName(nameof(JoinGroupFn))]
public static async Task<IActionResult> Run(
[HttpTrigger(
AuthorizationLevel.Anonymous,
"post",
Route = nameof(JoinGroupFn))]
HttpRequest req,
[SignalR(HubName = "LocationHub")]
IAsyncCollector<SignalRMessage> signalRMessages,
ILogger log)
{
log.LogInformation($"{nameof(JoinGroupFn)} has been invoked.");
try
{
var groupId = await req.ReadAsStringAsync();
await signalRMessages.AddAsync(
new SignalRMessage
{
Target = "JoinGroup",
GroupName = groupId,
Arguments = new[] { groupId }
});
log.LogInformation($"{nameof(JoinGroupFn)} {groupId}");
return new OkObjectResult(groupId);
}
catch (Exception ex)
{
return new BadRequestObjectResult("There was an error: " + ex.Message);
}
}
}
type LocationHub() as x =
inherit Hub()
let this = (x :> Hub)
member x.LocationUpdate(v:SubjectLocation) =
async { do! this.Clients.Group(v.SessionId).SendAsync("LocationUpdate", v) |> Async.AwaitTask
} |> Async.StartAsTask
member x.JoinGroup(groupId:string) =
async { do! this.Groups.AddToGroupAsync(this.Context.ConnectionId, groupId) |> Async.AwaitTask
} |> Async.StartAsTask