【问题标题】:Database Change Notifications in ASP.NET using SignalR and SqlDependency使用 SignalR 和 SqlDependency 的 ASP.NET 中的数据库更改通知
【发布时间】:2015-03-17 22:39:05
【问题描述】:

我是一个认真的 MVC 和 SignalR 新手!

我在网上找到了 this 教程,该教程展示了如何使用数据库更改通知并在 MVC 应用程序中显示数据。我遇到的问题是复制 MVC 方面的事情。我已经设法正确完成本教程并启动应用程序,但是,我得到了一个未定义的连接并且应用程序爆炸了。

有谁知道我在哪里可以找到这个示例的相关源文件,或者有谁成功地实现了这个,并且可以从 MVC 的角度阐明这个配置。

谢谢!

【问题讨论】:

  • Signalr 很容易设置,从头开始,创建一个新的 MVC4 项目,通过 NUGET 安装 singalr,创建一个返回“hello world”字符串的测试中心类。在连接到测试中心的视图中创建一个客户端,使用 jQuery/javascript 使用从测试中心返回的值更新您的 html,然后从那里构建。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 signalr


【解决方案1】:

要使用 SignalR 和 SQL 依赖项显示来自 SQL Server 的实时更新,我已完成以下步骤:

第 1 步:在数据库上启用 Service Broker

以下是需要启用服务代理的查询

ALTER DATABASE BlogDemos SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE ;

第 2 步:启用 SQL 依赖项

//Start SqlDependency with application initialization
 SqlDependency.Start(connString);

第 3 步:创建中心类

public class MessagesHub : Hub
    {
        private static string conString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();
        public void Hello()
        {
            Clients.All.hello();
        }

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


    }

第 4 步:从存储库中获取数据

创建 MessagesRepository 以在数据更新时从数据库中获取消息。

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

        public IEnumerable<Messages> GetAllMessages()
        {
            var messages = new List<Messages>();
            using (var connection = new SqlConnection(_connString))
            {
                connection.Open();
                using (var command = new SqlCommand(@"SELECT [MessageID], [Message], [EmptyMessage], [Date] FROM [dbo].[Messages]", 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())
                    {
                        messages.Add(item: new Messages { MessageID = (int)reader["MessageID"], Message = (string)reader["Message"], EmptyMessage =  reader["EmptyMessage"] != DBNull.Value ? (string) reader["EmptyMessage"] : "", MessageDate = Convert.ToDateTime(reader["Date"]) });
                    }
                }

            }
            return messages;


        }

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

第五步:在启动类注册 SignalR

app.MapSignalR();

第6步:然后使用该方法在您的视图中显示实时

<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 () {
            alert("connection started")
            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>

希望这会有所帮助:)

【讨论】:

  • 我正在尝试实现这一点。它没有给出错误,但所有数据都显示为“未定义”,而不是显示几行,而是显示了这么多行(在可能的情况下,它应该显示 7 行和 2 列,但显示 91 行和 2 列)。知道为什么这里没有显示实际记录吗?
  • @giparekh 使用 console.log(result);在 ajax success() 回调并检查 JSON 数据格式是否正确
【解决方案2】:

你应该提供你的代码,这样更容易找出问题所在。

从你所提到的,我只能想到两件事。

1) 您使用的教程,它使用的是 SignalR 1.0。如果您使用的是 SignalR 2.0,则不应完全按照本教程进行操作。 SignalR 2.0 中发生了一些变化,您可以使用以下链接了解它:

http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/upgrading-signalr-1x-projects-to-20

2) 如果您使用的是 SignalR 1.0,请确保正确包含“jquery”文件,如果正确,请尝试更改集线器代理路径,如下所示:

  <script src="/signalr/Hubs"></script>

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多