Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure SignalR InvokeAsync在尝试建立组连接时挂起_Signalr_Azure Signalr - Fatal编程技术网

Azure SignalR InvokeAsync在尝试建立组连接时挂起

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

在连接上调用InvokeAsync挂起

我正在引用以下内容来配置Azure Signal中的组连接

注:

我只能在不依赖组配置的情况下建立连接

客户端:

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