C# 在.NETCore3.1中,如何正确地将Signal和SQLTableDependency与Razor页面一起使用?

C# 在.NETCore3.1中,如何正确地将Signal和SQLTableDependency与Razor页面一起使用?,c#,asp.net-core,razor-pages,asp.net-core-signalr,sqldependency,C#,Asp.net Core,Razor Pages,Asp.net Core Signalr,Sqldependency,我想说的是,我对SignalR和SqlTableDependency还是相当陌生的。在过去的两周里,我一直在努力抓住这些话题,阅读我能找到的每一篇博客文章、微软文档或YouTube视频。起初,我只需制作一个示例Razor Pages应用程序并阅读Microsoft文档,就可以让信号器独自工作。这对我来说很好 因此,我尝试使用SqlDependency,但无论我查阅了什么教程,我都无法触发OnChange事件。所以我放弃了这一点,转而使用SqlTableDependency,查找有关如何使用它的任

我想说的是,我对
SignalR
SqlTableDependency
还是相当陌生的。在过去的两周里,我一直在努力抓住这些话题,阅读我能找到的每一篇博客文章、微软文档或YouTube视频。起初,我只需制作一个示例Razor Pages应用程序并阅读Microsoft文档,就可以让信号器独自工作。这对我来说很好

因此,我尝试使用
SqlDependency
,但无论我查阅了什么教程,我都无法触发
OnChange
事件。所以我放弃了这一点,转而使用
SqlTableDependency
,查找有关如何使用它的任何资源。然后,我的
OnChange
事件像预期的那样启动,但随后我又遇到了一些问题。在我展示我的代码之后,我会进入这个领域

基本上,我有一个聊天室聊天应用程序。我正试图做到,每当用户加入一个文件室时,查看文件室信息的所有其他用户都将自动从数据库中看到更新的用户数,而无需刷新页面

以下是我目前的代码:

因此,首先,我在数据库中设置了
ENABLE\u BROKER
,并创建了一个新用户

ALTER DATABASE ChattingApp SET单用户即时回滚
ALTER DATABASE ChattingApp SET ENABLE_BROKER;
ALTER DATABASE ChattingApp设置立即回滚的多用户
创建登录名[ChattingUser],密码为N'WhateOverPasswordIPuther',
默认\u数据库=[ChattingApp],选中\u过期=关闭,
勾选_POLICY=OFF
创建用户[ChattingUser]以登录[ChattingUser]
使用默认的_模式=[dbo]
授予[ChattingUser]更改权限
授予连接到[ChattingUser]
将控制权授予[ChattingUser]
将创建合同授予[ChattingUser]
将创建消息类型授予[ChattingUser]
将创建表授予[ChattingUser]
将创建过程授予[ChattingUser]
将创建队列授予[ChattingUser]
将创建服务授予[ChattingUser]
授予[ChattingUser]执行权限
将选择权授予[ChattingUser]
向[ChattingUser]授予订阅查询通知
将视图数据库状态授予[ChattingUser]
将视图定义授予[ChattingUser]
我的中心类:
ChatProxy.cs

公共类ChatProxy:Hub{
}
Startup.cs

公共类启动{
公共启动(IConfiguration配置){
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务){
services.TryAddSingleton();
配置(选项=>{
options.AllowSynchronousIO=true;
});
services.AddControllersWithViews().AddRazorRuntimeCompilation();
services.AddSession(选项=>{
options.IdleTimeout=TimeSpan.FromMinutes(30);
options.Cookie.IsEssential=true;
});
services.AddSignalR();
services.AddTransient();
services.AddTransient();
services.AddTransient();
AddAntiforgery(o=>o.HeaderName=“RequestVerificationToken”);
services.AddMemoryCache();
services.AddRazorPages();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境){
if(env.IsDevelopment()){
app.UseDeveloperExceptionPage();
}否则{
app.UseExceptionHandler(“/Error”);
//默认的HSTS值为30天。您可能希望在生产场景中更改此值,请参阅https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSession();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(端点=>{
endpoints.MapRazorPages();
endpoints.MapHub(“/chatHub”);
});
}
}
我的javascript类:
enterroom.js

“严格使用”;
var script=document.createElement('script');
script.src=https://code.jquery.com/jquery-3.4.1.min.js';
script.type='text/javascript';
document.getElementsByTagName('head')[0].appendChild(脚本);
var connection=new signar.HubConnectionBuilder().withUrl(“/chatHub”).build();
connection.start().then(函数(){
log(“自定义消息:连接成功启动”);
}).catch(函数(err){
log(“自定义消息:connection.start()引发错误”);
返回console.error(err.toString());
});
connection.on(“ReceiveChatUpdates”,函数(){
var url=新url(window.location.href);
var params=url.searchParams;
参数集(“处理程序”、“刷新服务器信息”);
url.search=params.toString();
var newUrl=url.toString();
$.ajax({
类型:“POST”,
url:newUrl,
发送前:函数(xhr){
setRequestHeader(“RequestVerificationToken”,
$('input:hidden[name=“\uu RequestVerificationToken”]”)val();
},
成功:功能(响应){
控制台日志(响应);
},
失败:功能(错误){
console.log(错误);
}
})
log(“自定义消息:ReceiveChatUpdates”);
});
使用连接字符串的数据库类:
DatabaseAccess.cs

公共类数据库访问{
公共字符串检索ConnectionString(){
return@“数据源=(LocalDB)\MSSQLLocalDB;初始目录=聊天应用程序;持久化