如何使用实时(SignalR)更新数据

时间:2014-10-01 13:21:32

标签: javascript c# jquery asp.net signalr

我正在写信寻求帮助,关于使用SignalR创建实时数据更新。我目前在客户端遇到问题,我无法呈现数据内容。

我已经测试了查询命令,它似乎正在返回数据。这让我相信,我的客户端代码可能不正确。

<script src="~/Scripts/jquery-1.8.2.min.js" type="text/javascript" ></script>
<script src="~/Scripts/jquery.signalR-2.0.1.min.js" type="text/javascript" ></script>
<script src="~/signalr/hubs" type="text/javascript" ></script>
<script type="text/javascript">
$(function () {
    // Declare a proxy to reference the hub.          
    var notifications = $.connection.NotificationHub;
    // Create a function that the hub can call to broadcast messages.
    notifications.client.recieveNotification = function (role, descrip) {
        // Add the message to the page.                    
        $('#spanNewMessages').text(role);
        $('#spanNewCircles').text(descrip);

    };
    // Start the connection.
   $.connection.hub.start().done(function () {
        notifications.server.sendNotifications(function () {
            alert("does it work");
            });
    }).fail(function (e) {
        alert(e);
    });
 </script>
 <h1>New Notifications</h1>
 <div>
<b>New <span id="spanNewMessages"></span> role.</b><br />
<b>New<span id="spanNewCircles"></span> descrip.</b><br />

 </div>

枢纽类:

  [HubName("NotificationHub")]
  public class notificationHub : Hub
  {
    string role = "";
    string descrip = "";

    [HubMethodName("sendNotifications")]
    public void SendNotifications()
    {
        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["dummyConnectionString"].ConnectionString))
        {
            string query = "SELECT [role],[description] FROM [dbo].[User]";
            connection.Open();
            using (SqlCommand command = new SqlCommand(query, connection))
            {                  
                command.Notification = null;                
                DataTable dt = new DataTable();
                SqlDependency dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                if (connection.State == ConnectionState.Closed)
                    connection.Open();                
                var reader = command.ExecuteReader();
                dt.Load(reader);
                if (dt.Rows.Count > 0)
                {
                    role = dt.Rows[0]["role"].ToString();
                    descrip = dt.Rows[0]["description"].ToString();

                }
            }  
        }

     Clients.All.RecieveNotification(role, descrip);
    }
    private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            notificationHub nHub = new notificationHub();
            nHub.SendNotifications();
        }
    }

}

StartUp CLass:

 using Microsoft.Owin;
 using Owin;
 using WebApplication2;

 namespace WebApplication2
 {
   public class Startup
    {
       public void Configuration(IAppBuilder app)
       {
        app.MapSignalR();
       }
    }
  }

任何人,请提供一些助手,我可能会在这个任务中出错。谢谢。

1 个答案:

答案 0 :(得分:1)

我嘲笑了你的应用。您的问题是您从集线器操作中返回一个字符串:

public string SendNotifications()
{
    return context.Clients.All.RecieveNotification(role, descrip);
}

这应该是无效的(您不会返回任何内容,但实际上是在调用客户端),而且您也不需要使用GlobalHost来获取上下文,只有当上下文不是“ t可用(IE从服务器调用集线器)。尝试进行这些更改:

[HubMethodName("sendNotifications")]
public void SendNotifications()
{
    //using...

    //IHubContext context = GlobalHost.ConnectionManager.GetHubContext<notificationHub>();
    //return context.Clients.All.RecieveNotification(role, descrip);

    Clients.All.RecieveNotification(role, descrip);
}

Clients.All...处放置一个断点,看看它是否被触发。如果这些更新能解决您的问题,请与我们联系。