SignalR不调用jQuery函数

Sev*_*ano 4 javascript c# asp.net jquery signalr

我在我的页面中有这段代码,但是当我在数据库中进行更改时它不会运行,可能是什么问题.这开始很好,当我加载页面时,这执行两次函数,但如果我向数据库发送一个消息,这不执行.

$(function () {

var chat = $.connection.chatHub;
chat.client.allTalks = function () {
    refresh();
};
$.connection.hub.start();
    refresh();

});
Run Code Online (Sandbox Code Playgroud)

服务器端(中心):

    [HubName("chatHub")]
    public class ChatHub : Hub
    {
        public static void AllTalks()
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
            context.Clients.All.allTalks();
        }
    }
Run Code Online (Sandbox Code Playgroud)

HANDLER

...

using (SqlCommand command = new 
SqlCommand(@"SELECT * FROM [dbo].[chat_talks]", connection)) {
Run Code Online (Sandbox Code Playgroud)

//内容

SqlDependency dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
Run Code Online (Sandbox Code Playgroud)

... }

        public void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            ChatHub.AllTalks();
        }
Run Code Online (Sandbox Code Playgroud)

Global.asax中

        protected void Application_Start(object sender, EventArgs e)
        {
            SqlDependency.Start(ConfigurationManager.ConnectionStrings["ProjectSellerConnection"].ConnectionString);
        }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Jam*_*aug 6

首先,在服务器端代码中使用第一行是多余的.无需在集线器内调用hubContext.你可以这样做:

public static void AllTalks()
{
    Clients.All.allTalks();
}
Run Code Online (Sandbox Code Playgroud)

我建议,也许是愚蠢的,不要使用SQL依赖.我建议使用以下调用SignalR的技术(具体来说,它将调用客户端函数):

var hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
hubContext.Clients.All.allTalks();
Run Code Online (Sandbox Code Playgroud)

您可以在MVC和WebAPI控制器中执行此操作,这意味着如果您在这些操作中执行了任何数据库更新,则可以随后使用此方法调用客户端.我知道它不像SQL Dependency那么华丽,也许不是你想要的答案,但它会解决你的问题 - 因为看起来问题似乎是SignalR检测到数据库的变化.

换句话说,这种方法可行,但它可能不是您所希望的精确方法.