使用 RavenDb 和 SignalR 进行推送通知






4.56/5 (6投票s)
一个简单的电子邮件收件箱,使用 NoSQL 数据库,当向集合添加新文档时,将记录推送到客户端。
引言
在本文中,我们将实现一个简单的电子邮件收件箱,使用 NoSQL 数据库,当向集合添加新文档时,将记录推送到客户端。
假定读者具备 RavenDb、DocumentStore、DocumentCollection 等基本知识,以及 ASP.NET MVC 和 SignalR 框架的基本知识。
该应用程序非常简单,旨在教育读者,而不是给读者留下深刻印象咳嗽* Marcelo Ricardo de Oliveira 咳嗽*
背景
Changes API 提供了订阅文档和 DocumentCollection 更改的强大功能,但是,我认为文档不够充分,我的目标是在这里提供简单的有效代码。
逐步说明
RavenDb 设置
- 从 RavenDB 下载(撰写本文时为 2750)下载并提取最新的稳定版本(Zip 存档)。
- 通过执行 /RavenDB-Build-2750/Start.cmd 启动并运行服务器,如果出现异常“无法加载计数器名称数据,因为从注册表中读取了无效索引“”,请以管理员身份运行 cmd,然后运行命令 lodctr /r,然后重新运行。
- 您应该得到这个
- 转到 https://:8080
- 创建一个名为 RavenDbDemo 的新数据库
项目设置
- 以管理员身份运行 Visual studio
- 创建一个新的 MVC 项目
- 在 IIS 中创建一个新的虚拟目录,指向应用程序路径
- 将网站的应用程序池的标识更改为当前用户
- 将 RavenDb 引用添加到应用程序
- 添加 SignalR 引用
- 将 RavenDb 连接字符串添加到 web.config
<add name="RavenDB" connectionString="Url=https://:8080;Database=RavenDbDemo" />
代码
为了使用 changes api,我们必须创建一个实现 IObserver<DocumentChangeNotification>
的观察者类,以便在向集合添加新文档时采取行动,EmailsObserver.cs 正是这样做的
using System;
using Entities;
using Raven.Abstractions.Data;
using WebUI.Hubs;
namespace WebUI.Models
{
public class EmailsObserver : IObserver<DocumentChangeNotification>
{
public void OnCompleted()
{
}
public void OnError(Exception error)
{
//ToDo:handle exception
}
public void OnNext(DocumentChangeNotification documentChangeNotification)
{
if (documentChangeNotification.Type == DocumentChangeTypes.Put)//new document inserted
{
Email newEmail;
using (var session = MvcApplication.Store.OpenSession())
{
newEmail = session.Load<Email>(documentChangeNotification.Id);//get document by id
}
new EmailHub().Send(newEmail.Sender, newEmail.Subject);//notify clients
}
}
}
}
很好,现在我们需要订阅文档集合中的更改,因此,在 Global.asax 中添加函数 CheckForEmails()
private static void CheckForEmails()
{
Store
.Changes()
.ForDocumentsStartingWith("Emails/")//monitor our Emails document collection
.Subscribe(new EmailsObserver());
}
然后确保在实例化 Document Store 后调用它
protected void Application_Start()
{
Store = new DocumentStore { ConnectionStringName = "RavenDB" };
Store.Initialize();
CheckForEmails();
[....rest of code to register routes, filters, etc...]
}
在我们的 Index.cshtml 中
@{
ViewBag.Title = "Inbox";
}
<h2>Inbox</h2>
<div class="container">
<ul id="inbox">
</ul>
</div>
@section scripts {
<script src="@Url.Content("~/Scripts/jquery.signalR-2.0.0.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/signalr/hubs")"
type="text/javascript"></script>
<script>
$(function () {
$.connection.hub.start().done(function () {
});
var email = $.connection.emailHub;
email.client.addEmail = function (sender, subject) {
$('#inbox').append('<li><strong>' + sender
+ '</strong>: ' + subject + '</li>');
};
});
</script>
}
就是这样,运行应用程序,在 Emails 文档集合中插入一个新电子邮件。
然后它应该立即显示在网页上。
棘手的部分
在实现此项目时,我遇到了一些问题
异常:“此操作需要 IIS 集成管道模式。”
SignalR 异常,项目应该在 IIS 下运行,而不是 VS 服务器。
异常:“无法访问请求的页面,因为页面的相关配置数据无效。”
RavenDb 异常,从 web.config 中删除处理程序 <add name="All" path="*" verb="*" type="Raven.Web.ForwardToRavenRespondersFactory, Raven.Web" />
。
异常:“无法访问文件,该文件已锁定或正在使用中”
RavenDb 异常,确保网站的应用程序池具有权限。
结论
就是这样,希望我提供了一个清晰的解释和一个简单的应用程序来演示 RavenDb 推送功能。 与往常一样,如果您有任何意见或问题,请告诉我 ;)