.net Azure信号器设置服务器超时

.net Azure信号器设置服务器超时,.net,azure,websocket,signalr,.net,Azure,Websocket,Signalr,我想在azure托管的信号器上设置服务器超时。我正在.net core中编写web api项目,并在startup.cs中设置了此信号器配置(分别为configureservices和configure): public void配置服务(IServiceCollection服务) { ... services.AddSignalR().AddAzureSignalR(Configuration.GetSection(“值”)[“AzureSignalConnectionString]”); .

我想在azure托管的信号器上设置服务器超时。我正在.net core中编写web api项目,并在startup.cs中设置了此信号器配置(分别为configureservices和configure):

public void配置服务(IServiceCollection服务)
{
...
services.AddSignalR().AddAzureSignalR(Configuration.GetSection(“值”)[“AzureSignalConnectionString]”);
...
}
//此方法由运行时调用。使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
...
应用程序UseAzureSignal(路线=>
{
routes.MapHub(“/geolocation”);
路线。MapHub(“/商场”);
});
...
}
保持活力平做得很好。服务器每隔15秒发送一次。 但是,如果我在chrome devtools中选择脱机模式,并在40秒后恢复联机,服务器仍会响应keep alive ping:

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

我还看到页面刷新使以前的连接保持活动状态,并创建一个新的连接。在执行F5时,不会调用集线器中的OnDisconnectedAsync()。最后,我从azure signalr服务获得了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; }
}
[授权(角色=“卖方,用户”)]
公共类MallHub:Hub
{
私有只读IOfferService(U offerService);
公共购物中心(IOfferService offerService)
{
_offerService=offerService;
}
公共静态字典ConnectedUsers{get;set;}
公共覆盖异步任务OnConnectedAsync()
{
尝试
{
var userId=Context.User.Claims.FirstOrDefault(c=>c.Type==“id”).Value;
var mallCodename=Context.User.Claims.FirstOrDefault(c=>c.Type==“mcn”).Value;
Add(userId,new UserInMall(){ConnectionId=Context.ConnectionId,MallCodename=MallCodename});
var offers=await _offerService.GetUserOffersById(userId);
等待Clients.Client(Context.ConnectionId).SendAsync(“updateOffers”,offers);
等待base.OnConnectedAsync();
}
捕获(例外e)
{
抛出新的HubException(e.Message);
}
}
公共覆盖任务OnDisconnectedAsync(异常)
{
var userId=Context.User.Claims.FirstOrDefault(c=>c.Type==“id”).Value;
ConnectedUsers.Remove(userId);
返回base.OnDisconnectedAsync(异常);
}
公共异步任务SendOfferToUserById(字符串id,IEnumerable提供)
{
var userId=Context.User.Claims.FirstOrDefault(c=>c.Type==“id”).Value;
等待Clients.Client(ConnectedUsers[userId].ConnectionId).SendAsync(“updateOffers”,offers);
}
}
公共类UserInMall
{
公共字符串连接ID{get;set;}
公共字符串MallCodename{get;set;}
}
有没有更好的方法来维护中心状态?我需要这个,以便从中心外部呼叫特定客户。我正在将我的域用户ID映射到集线器连接ID

[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; }
}