Azure Signalr设置服务器超时

时间:2019-08-19 14:29:50

标签: .net azure websocket signalr

我想在我的azure托管信号器上设置服务器超时。我正在.net核心中编写Web api项目,并且已经在startup.cs中设置了此信号器配置(分别配置服务和配置):

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddSignalR().AddAzureSignalR(Configuration.GetSection("Values")["AzureSignalRConnectionString"]);
        ...
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ...
        app.UseAzureSignalR(routes =>
        {
            routes.MapHub<GeolocationHub>("/geolocation");
            routes.MapHub<MallHub>("/mall");
        });
        ...
    }

保持ping正常运行。服务器以15秒的间隔发送它。 但是,如果我在chrome devtools中选择离线模式并在例如40秒后,服务器仍然响应并保持ping通状态:https://i.stack.imgur.com/Ptv6Y.png

我不希望这种行为。我希望服务器在客户端在给定时间间隔(在我的示例中为30秒)内无响应的情况下处理连接丢失的情况。

我还看到页面刷新使以前的连接保持活动状态并创建了一个新连接。在执行F5时,不会调用集线器中的OnDisconnectedAsync()。最终,我从azure信号器服务那里得到429-在azure门户上,有一张图显示了20个并发连接(我选择了免费层,其中有20个同时连接可用)。

当客户端没有在给定的间隔内响应时,是否会调用OnDisconnectedAsync()?我的中心有一个状态,可以跟踪已连接的用户。每当用户连接/断开连接时,我都想更新此集合。

[Authorize(Roles = "Seller, User")]
    public class MallHub : Hub
    {
        private readonly IOfferService _offerService;

        public MallHub(IOfferService offerService)
        {
            _offerService = offerService;
        }

        public static Dictionary<string, UserInMall> ConnectedUsers { get; set; }

        public override async Task OnConnectedAsync()
        {
            try
            {
                var userId = Context.User.Claims.FirstOrDefault(c => c.Type == "id").Value;
                var mallCodename = Context.User.Claims.FirstOrDefault(c => c.Type == "mcn").Value;
                ConnectedUsers.Add(userId, new UserInMall() { ConnectionId = Context.ConnectionId, MallCodename = mallCodename });
                var offers = await _offerService.GetUserOffersById(userId);
                await Clients.Client(Context.ConnectionId).SendAsync("updateOffers", offers);
                await base.OnConnectedAsync();
            }
            catch (Exception e)
            {
                throw new HubException(e.Message);
            }
        }

        public override Task OnDisconnectedAsync(Exception exception)
        {
            var userId = Context.User.Claims.FirstOrDefault(c => c.Type == "id").Value;
            ConnectedUsers.Remove(userId);
            return base.OnDisconnectedAsync(exception);
        }

        public async Task SendOfferToUserById(string id, IEnumerable<Contracts.POCO.Offer> offers)
        {
            var userId = Context.User.Claims.FirstOrDefault(c => c.Type == "id").Value;
            await Clients.Client(ConnectedUsers[userId].ConnectionId).SendAsync("updateOffers", offers);
        }
    }

public class UserInMall
{
    public string ConnectionId { get; set; }
    public string MallCodename { get; set; }
}

是否有更好的方法来维护集线器状态?我需要这样做,以便从集线器外部呼叫特定的客户端。我正在将域userId映射到集线器connectionId。

0 个答案:

没有答案