我想在我的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。