65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 RavenDb 和 SignalR 进行推送通知

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (6投票s)

2013年11月18日

CPOL

2分钟阅读

viewsIcon

34046

一个简单的电子邮件收件箱,使用 NoSQL 数据库,当向集合添加新文档时,将记录推送到客户端。

引言

在本文中,我们将实现一个简单的电子邮件收件箱,使用 NoSQL 数据库,当向集合添加新文档时,将记录推送到客户端。

假定读者具备 RavenDb、DocumentStore、DocumentCollection 等基本知识,以及 ASP.NET MVCSignalR 框架的基本知识。

该应用程序非常简单,旨在教育读者,而不是给读者留下深刻印象咳嗽* Marcelo Ricardo de Oliveira 咳嗽*

背景

Changes API 提供了订阅文档和 DocumentCollection 更改的强大功能,但是,我认为文档不够充分,我的目标是在这里提供简单的有效代码。

逐步说明

RavenDb 设置

  1. RavenDB 下载撰写本文时为 2750)下载并提取最新的稳定版本(Zip 存档)。
  2. 通过执行 /RavenDB-Build-2750/Start.cmd 启动并运行服务器,如果出现异常“无法加载计数器名称数据,因为从注册表中读取了无效索引“”,请以管理员身份运行 cmd,然后运行命令 lodctr /r,然后重新运行。
  3. 您应该得到这个
  4. 转到 https://:8080
  5. 创建一个名为 RavenDbDemo 的新数据库

项目设置

  1. 以管理员身份运行 Visual studio
  2. 创建一个新的 MVC 项目
  3. 在 IIS 中创建一个新的虚拟目录,指向应用程序路径
  4. 将网站的应用程序池的标识更改为当前用户
  5. 将 RavenDb 引用添加到应用程序
  6. 添加 SignalR 引用
  7. 将 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 推送功能。 与往常一样,如果您有任何意见或问题,请告诉我 ;)

© . All rights reserved.