我有一个网站,它使用 websockets 与服务器通信以流式传输实时金融报价。当页面不在前台时,大约 3 分钟后 Chrome 会终止套接字连接。可以在服务器日志中看到套接字断开连接。只要我在后台处理后的几分钟内将页面带到前台,套接字就会保持活动状态。
我知道 Chrome(可能还有其他基于 Chromium 的浏览器)会限制后台页面以节省电量、CPU 和内存。但是,我无法找到永久禁用给定 URL 的此功能的方法。
我是否错过了什么,或者真的没有办法强制 Chrome 在所有情况下都保持某个 URL 处于活动状态?
谢谢
我正在尝试在 ASP.Net Core 3.0 Web Api 项目中使用基于 cookie 的身份验证。
目前,我的配置服务如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
})
.AddCookie("Cookies", options =>
{
options.Cookie.Name = "auth_cookie";
options.Cookie.SameSite = SameSiteMode.None;
options.Events = new CookieAuthenticationEvents
{
OnRedirectToLogin = redirectContext =>
{
redirectContext.HttpContext.Response.StatusCode = 401;
return Task.CompletedTask;
}
};
});
services.AddAuthorization();
services.AddControllers();
}
Run Code Online (Sandbox Code Playgroud)
我的配置方法如下所示:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("CorsPolicy");
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization(); …Run Code Online (Sandbox Code Playgroud) 我需要将自定义消息格式化程序应用于服务中的所有操作.
我没有手动将OperationBehavior应用于所有操作,而是试图在ServiceBehavior中循环遍历所有操作(我的序列化程序的细节并不重要,只是它实现了IDispatchMessageFormatter):
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) {
foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers) {
foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints.Where(e => !e.IsSystemEndpoint)) {
foreach (DispatchOperation dispatchOperation in endpointDispatcher.DispatchRuntime.Operations) {
LoggedOperationSerializer serializer = new LoggedOperationSerializer(dispatchOperation.Formatter);
dispatchOperation.Formatter = serializer;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
串行器似乎设置得很好,没有错误.但是,当我设置断点和调试时,永远不会触发LoggedOperationSerializer上的DeserializeRequest方法.
相反,如果我在这样的OperationBehavior中应用格式化程序:
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) {
LoggedOperationSerializer serializer = new LoggedOperationSerializer(dispatchOperation.Formatter);
dispatchOperation.Formatter = serializer;
}
Run Code Online (Sandbox Code Playgroud)
然后按预期命中DeserializeRequest方法.
如果我同时应用ServiceBehvior和OperationBehavior并按预期附加调试器,则首先触发显示的第一个代码块,迭代服务上的所有操作,并设置格式化程序.但是,当命中OperationBehavior的ApplyDispatchBehavior时,上面设置的格式化程序已"掉线",并且已被默认的CompositeDispatchFormatter替换.
我真的不想手动将OperationBehavior应用于所有操作以使其工作......任何关于为什么会发生什么的想法?
这是在使用WebHttpBinding的情况下完全相关,我不知道为什么会这样.