.net Azure信号器设置服务器超时
我想在azure托管的信号器上设置服务器超时。我正在.net core中编写web api项目,并在startup.cs中设置了此信号器配置(分别为configureservices和configure):.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]”); .
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; }
}