我是一个认真的 MVC 和 SignalR 新手!
我在网上找到了这个教程,它展示了如何使用数据库更改通知并在 MVC 应用程序中显示数据。我遇到的问题是复制 MVC 方面的事情。我已经设法正确地完成了本教程并启动了应用程序,但是,我得到了一个未定义的连接并且应用程序爆炸了。
有谁知道我在哪里可以找到此示例的相关源文件,或者是否有人成功地实现了这一点,并且可以从 MVC 的角度对它的配置有所了解。
谢谢!
我是一个认真的 MVC 和 SignalR 新手!
我在网上找到了这个教程,它展示了如何使用数据库更改通知并在 MVC 应用程序中显示数据。我遇到的问题是复制 MVC 方面的事情。我已经设法正确地完成了本教程并启动了应用程序,但是,我得到了一个未定义的连接并且应用程序爆炸了。
有谁知道我在哪里可以找到此示例的相关源文件,或者是否有人成功地实现了这一点,并且可以从 MVC 的角度对它的配置有所了解。
谢谢!
要使用 SignalR 和 SQL Dependency 显示来自 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();
}
}
}
第 5 步:在启动类中注册 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>
希望这可以帮助 :)
您应该提供您的代码,这样更容易找出问题所在。
从你提到的情况来看,我只能想到两件事。
1)您使用的教程,它使用的是 SignalR 1.0。如果您使用的是 SignalR 2.0,则不应完全按照本教程进行操作。SignalR 2.0 中发生了一些变化,您可以使用以下链接了解它:
2) 如果您使用的是 SignalR 1.0,请确保正确包含“jquery”文件,如果正确,请尝试更改集线器代理路径,如下所示:
<script src="/signalr/Hubs"></script>
希望能帮助到你