ABP官方文档(四十八)【集成SignalR】

8.2 ABP实时服务 - 集成SignalR

8.2.1 简介

在基于ABP创建的项目中,有一个很容易的方式使用 SignalR,那就是使用 Abp.Web.SignalR。详情请参考SignalR文档

8.2.2 安装

1. 服务器端

使用Nuget安装Abp.Web.SignalR到你的项目中(通常是你的Web项目)并且在模块中添加被依赖的模块:

[DependsOn(typeof(AbpWebSignalRModule))]
public class YourProjectWebModule : AbpModule
{
    //...
}

然后,在你的OWIN Startup类中使用 MapSignalR 方法,正如你往常那样做的:

[assembly: OwinStartup(typeof(Startup))]
namespace MyProject.Web
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();

            //...
        }
    }
}

注意:Abp.Web.SignalR 依赖于 Microsoft.AspNet.SignalR.Core。所以,你需要安装 Microsoft.AspNet.SignalR到你的Web项目中。详情请参考SignalR文档

2. 客户端

脚本 abp.signalr.js 应该被引用到页面中。它位于 Abp.Web.Resources 包中(它已经被安装到启动模板中)。
我们应该在 signalr hubs 后引用它:


<script src="~/signalr/hubs"></script>
<script src="~/Abp/Framework/scripts/libs/abp.signalr.js"></script>

这么做了以后,SignalR就已经恰当的配置和集成到你的项目中了。

3. 建立连接

abp.signalr.js 被引用到页面后,ABP会自动的连接到你的服务器。一般我们都会这么做,但是在某些情况下你不想这样做。你可以像下面代码所示禁用自动连接:

<script>
    abp.signalr = abp.signalr || {};
    abp.signalr.autoConnect = false;
</script>

在这种情况下,你可以手动调用 abp.signalr.connect() 函数来连接服务器。

当客户端连接到服务器时,全局事件 “abp.signalr.connected” 会被触发。当连接建立成功的时候,你可以注册这个事件来采取相应的行动。详情请参考Javascript函数库

8.2.3 内置功能

你可以在应用程序中使用所有的SignalR的功能。还有,在 Abp.Web.SignalR 中实现了一些内置功能。

1. 通知

Abp.Web.SignalR 实现了 IRealTimeNotifier 接口来发送实时时间到客户端。因此,你的用户可以获得实时的推送通知。

2. 在线客户端

ABP提供了 IOnlineClientManager 来取得在线用户的信息(如:注入IOnlineClientManager以及使用GetByUserIdOrNull, GetAllClients, IsOnline 方法)。为了能够正常工作,IOnlineClientManager需要一个通信基础设施。Abp.Web.SignalR 提供了这个基础设施。如果安装了SignalR,那么在应用的任何层都可以注入并使用IOnlineClientManager。

3. PascalCase vs. camelCase

Abp.Web.SignalR 使用 CamelCasePropertyNamesContractResolver 重写了 SignalR’s 默认的序列化类 ContractResolver。因此,在服务器端类具有 PascalCase 属性,而在客户端为了发送/接受对象,我们使用 camelCase (因为camelCase在JavaScript中更受欢迎)。如果你想在某些程序集中忽略这个,那么你可以将那些程序集添加AbpSignalRContractResolver.IgnoredAssemblies 列表中。

8.2.3 你的SignaR代码

使用 Abp.Web.SignalR 包也会简化你的 SignalR代码。假设我们想要添加一个Hub到你的应用程序中:

public class MyChatHub : Hub, ITransientDependency
{
    public IAbpSession AbpSession { get; set; }

    public ILogger Logger { get; set; }

    public MyChatHub()
    {
        AbpSession = NullAbpSession.Instance;
        Logger = NullLogger.Instance;
    }

    public void SendMessage(string message)
    {
        Clients.All.getMessage(string.Format("User {0}: {1}", AbpSession.UserId, message));
    }

    public async override Task OnConnected()
    {
        await base.OnConnected();
        Logger.Debug("A client connected to MyChatHub: " + Context.ConnectionId);
    }

    public async override Task OnDisconnected(bool stopCalled)
    {
        await base.OnDisconnected(stopCalled);
        Logger.Debug("A client disconnected from MyChatHub: " + Context.ConnectionId);
    }
}

为了使我们的Hub可以简单的注册到依赖注入系统中,我们可以实现 ITransientDependency 接口。当然你可以根据你的需求,注册它为单例模式。我们也使用属性注入了SessionLogger

SendMessage是hub的一个方法,它可以被客户端使用。在这个方法中,我们可以调用所有客户端的 getMessage函数。正如你看到的那样,我们可以使用AbpSession来获得当前的用户id(如果用户已经登录)。为了演示,我们也重写了 OnConnected 和 OnDisconnected,实际这里是不需要的。

下面是用在Hub中,用来发送/接受信息的客户端脚本:

var chatHub = $.connection.myChatHub; //get a reference to the hub

chatHub.client.getMessage = function (message) { //register for incoming messages
    console.log('received message: ' + message);
};

abp.event.on('abp.signalr.connected', function() { //register for connect event
    chatHub.server.sendMessage("Hi everybody, I'm connected to the chat!"); //send a message to the server
});

然后,在我们需要发送信息到服务器时,我们就可以使用 chatHub。详情请参考SignalR文档

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABP (ASP.NET Boilerplate) 是一个流行的开源框架,提供了一些常用功能的实现,包括实体框架、用户认证、权限管理等。实现 Word 文档导出可以使用开源库 NPOI。 以下是基本的步骤: 1. 安装 NPOI 包。可以使用 NuGet 命令行工具,输入以下命令: ``` Install-Package NPOI ``` 2. 创建一个类,用于表示要导出的数据。 ``` public class MyData { public string Name { get; set; } public int Age { get; set; } //... } ``` 3. 创建一个方法,用于创建 Word 文档。在该方法中,使用 NPOI 创建一个新的文档,并将数据填充到表格中。 ``` using NPOI.XWPF.UserModel; using NPOI.OpenXmlFormats.Wordprocessing; public void ExportToWord(List<MyData> data) { // Create a new document from scratch XWPFDocument doc = new XWPFDocument(); // Create a table with headers XWPFTable table = doc.CreateTable(data.Count + 1, 2); table.GetRow(0).GetCell(0).SetText("Name"); table.GetRow(0).GetCell(1).SetText("Age"); // Fill in the data for (int i = 0; i < data.Count; i++) { table.GetRow(i + 1).GetCell(0).SetText(data[i].Name); table.GetRow(i + 1).GetCell(1).SetText(data[i].Age.ToString()); } // Save the document to a file FileStream file = new FileStream("output.docx", FileMode.Create); doc.Write(file); file.Close(); } ``` 这个方法将数据填充到一个包含两列的表格中,第一列为“Name”,第二列为“Age”。然后,将文档保存到名为“output.docx”的文件中。 4. 调用导出方法,将数据传递给它。 ``` List<MyData> data = GetDataFromDatabase(); ExportToWord(data); ``` 在这个例子中,我们从数据库中获取数据,并将它传递给导出方法。 这是最基本的示例。你可以根据需要自定义文档的外观和内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值