微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指定 User 或 ConnectionId 的 SingalR 和 SqlDependency

如何解决指定 User 或 ConnectionId 的 SingalR 和 SqlDependency

我在 ASP.NET MVC 中有以下实时程序,用于监视 sql Server 中的表更改,它适用于一个会话,但我想显示指定会话的表中所做的更改。

这是我的代码

集线器

public class MessagesHub : Hub {

    [HubMethodName("sendMessages")]
    public static void SendMessages()
    {
         IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MessagesHub>();
            
        context.Clients.All.updateMessages(); 
    }
}

sqlDependency

public class MessagesRepository
{
    readonly string _connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

    public IEnumerable<Messages> GetAllMessages(string name)
    {     
        var messages = new List<Messages>();
        using (var connection = new sqlConnection(_connString))
        {
            connection.open();
            using (var command = new sqlCommand(@"SELECT [id],[name],[age] FROM [dbo].[people]",connection))
            {
                command.Notification = null;

                var dependency = new sqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                if (connection.State == ConnectionState.Closed)
                    connection.open();

                var reader = command.ExecuteReader();

                while (reader.Read())
                {

                    if (!string.IsNullOrEmpty(name))
                    {
                        if ((string)reader["name"] == name)
                        {
                            messages.Add(item: new Messages { ID = (int)reader["id"],Name = (string)reader["name"] });
                        }
                    }
                    else
                    {
                        messages.Add(item: new Messages { ID = (int)reader["id"],Name = (string)reader["name"] });

                    }
                }
            }
        }
        return messages;
    }

    private void dependency_OnChange(object sender,sqlNotificationEventArgs e)
    {                          
        if (e.Type == sqlNotificationType.Change)
        {
            MessagesHub.SendMessages();
        }
    }
}

控制器

 public class HomeController : Controller
{
    public static string name;

    public ActionResult Index(string txt)
    {
        name = txt;

        return View();
    }
    
    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";

        return View();
    }
    public ActionResult GetMessages()
    {
        MessagesRepository model = new MessagesRepository();
        return PartialView("_MessagesList",model.GetAllMessages(name));
    }
}

Index.cshtml

<div class="row">
<div class="col-md-12">
    <div id="messagesTable"></div>
</div>
<form>
   <label>condition</label> <input name="txt" />
    <input name="id" />
    <button name="buttons" value="values" id="buttons">Apply Condition</button>
</form>
</div>

@section Scripts{
<script src="/Scripts/jquery.signalR-2.1.1.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="/signalr/hubs"></script>

<script type="text/javascript">


    $(function () {
        // Declare a proxy to reference the hub.
        var notifications = $.connection.messagesHub;

        //debugger;
        // Create a function that the hub can call to broadcast messages.
        notifications.client.updateMessages = function () {
            getAllMessages()

        };
        
        // Start the connection.
        $.connection.hub.start().done(function () {
            var cid = $.connection.hub.id;
            $("#connectionId").val(cid);
            console.log("connection Id:" + cid);
            alert(cid);

            getAllMessages();
        }).fail(function (e) {
            alert(e);
        });
    });
          

    function getAllMessages() {
        var tbl = $('#messagesTable');
        $.ajax({
            url: '/home/GetMessages',contentType: 'application/html ; charset:utf-8',type: 'GET',dataType: 'html'
        }).success(function (result) {
            tbl.empty().append(result);
        }).error(function () {

        });
    }
</script>
}

有没有办法指定我在表中所做的更改要为哪个 connectionId 或 UserId 显示

我希望我的问题很清楚。 任何帮助将不胜感激,因为我非常需要一个解决方案。

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。