ASP.NET SingalR不多介绍。让我介绍不如看官网,我这里就是直接上源代码,当然代码还是写的比较简单的,考虑的也少,希望各位技友多多提意见。

先简单介绍聊天室功能:

  • 用户加入聊天室,自动给用户名和头像。(可扩展用户自定义昵称和头像,未做)
  • 聊天信息发送,群聊。(可扩展1对1聊天,群组聊天,1对多聊天,扩展多种消息格式,未做)
  • 本地存储用户信息
  • 后台结合mongodb存储聊天信息,用户下次进入可以看到聊天记录(MongoDB .NET客户端的使用,可以用SQL或者缓存存储,不作为重点阐述)

写了这么多文字,是不是激不起兴趣来,好直接上一张图,然后搭建基本框架。

ok,我们开始搭建界面。

新建asp.net mvc 项目,然后添加一个SingalR集线器类。(不用手动引用singalR.dll,当然可以从nuget上安装)

其实hub代码比较简单,这里只为了实现简单聊天室功能,就不多写其他代码。因为未完善代码,所以暂时不公开。较为复杂点的代码,有兴趣的同学可以邮箱留言,我发给你们。

编写后台代码之前呢,先分析页面结构。首先,聊天基本内容包含:聊天内容,用户昵称,用户头像,用户发表时间,ok,那么新建一个model吧。

     public class ZjMessage : MongoBaseModel
{
public ZjMessage(){
createTime = DateTime.Now.ToString("MM-dd hh:mm:ss");
}
public ZjMessage(string connectionId)
{
this.connectionId = connectionId;
}
public string connectionId { get; set; } /// <summary>
/// 头像
/// </summary>
public string photo { get; set; }
/// <summary>
/// 消息内容
/// </summary>
public string msg { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string username { get; set; }
/// <summary>
/// 用户ID 这个用户ID,是为了区分是谁发的,(判断消息展示在左边或者右边)
/// </summary>
public string userid { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public string createTime { get; set; }
}

Model不多说,下面上zjHub代码(至于这个命名吗,你们随便),里面的各个方法已经注明,后面文章也会对各个方法做详细介绍。

   public class ZjHub : Hub
{
private readonly IBaseQuery<ZjMessage> query = MongoDBFactory<ZjMessage>.CreateInstance("zj");
/// <summary>
/// 连接服务器的方法,自动调用客户端,客户端需要定义receiveMessage方法
/// </summary>
/// <returns></returns>
public override async Task OnConnected()
{
try
{
//用户第一次进来,读取历史记录
var result = await query.GetListAsync(x => x.userid.Length > );
Clients.Caller.receiveHistoryMessage(new { type = "system", msg = "您已经进入聊天室", oldlist = result.ToList() });
}
catch (TimeoutException ex)
{ }
} /// <summary>
/// 重新连接服务器,自动调用客户端
/// </summary>
/// <returns></returns>
public override Task OnReconnected()
{
return Clients.Caller.receiveMessage(new { type = "system", msg = "您已经重新进入聊天室。" });
} public override Task OnDisconnected(bool stopCalled)
{
ZjMessage message = new ZjMessage(Context.ConnectionId);
//用户离开
return Clients.All.receiveMessage(new { type = "left", msg = message });
} public Task Join(ZjMessage message)
{
message.connectionId = Context.ConnectionId;
//就是用户加入的时候
return Clients.All.receiveMessage(new { type = "join", msg = message });
}
/// <summary>
/// 主要看这个方法,这个就是往服务器发送数据
/// </summary>
/// <param name="message">消息体是一个zjMessage </param>
/// <returns></returns>
public async Task Send(ZjMessage message)
{
message.connectionId = Context.ConnectionId;
//存到数据库
await query.InsertAsync(new List<ZjMessage> { message });
//定义客户端接收方法 ,这里是receiveMessage
//这里写成消息类型为msg new { type = "msg", msg = message }
Clients.All.receiveMessage(new { type = "msg", msg = message });
}
}

至此,后台代码基本已经结束了,其实好多业务功能就是前端的,后端主要负责的是服务器稳定性,性能优化等方面。这里暂且不提,看前端之前,在做一下服务地址的配置,在startup类里面编写如下代码。

 public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.Map("/push/im", map =>
{
var hubConfiguration = new HubConfiguration()
{
EnableJSONP = true
};
map.RunSignalR(hubConfiguration);
});
}
}

好了,让我们运行一下,看看这个hub类有没有起作用,本机地址是:http://localhost:40716/push/im/hubs (如果不加上述配置,地址默认为:http://localhost:40716/singalr/hubs),如果你看到这个地址是js文件,那么前台就能调用了。先看一下推送效果:

第一篇到此先告一段落。下篇预告:

  • 实现用户加入聊天室,推送用户加入信息
  • 实现用户加入聊天室,自动生成头像和对应昵称,并且保存到本地
  • 实现历史记录读取。(简单介绍)

就到这里啦,谢谢各位大牛捧场。

ASP.NET SingalR + MongoDB 实现简单聊天室(一):搭建基本框架的更多相关文章

  1. ASP.NET SingalR + MongoDB 实现简单聊天室(三):实现用户群聊,总结完善

    前两篇已经介绍的差不多了,本篇就作为收尾. 使用hub方法初始化聊天室的基本步骤和注意事项 首先确保页面已经引用了jquery和singalR.js还有对应的hubs文件,注意,MVC框架有时会将jq ...

  2. ASP.NET SingalR + MongoDB 实现简单聊天室(二):实现用户信息、聊天室初始化,聊天信息展示完善

    第一篇已经介绍了一大半了,下面就是详细业务了,其实业务部分要注意的地方有几个,剩下的就是js跟html互动处理. 首先在强调一下,页面上不可缺少的js:jquery,singalR.js,hubs . ...

  3. Asp.Net SignalR - 简单聊天室实现

    简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...

  4. C#实例之简单聊天室(状态管理)

    前言        状态管理是在同一页或不同页的多个请求发生时,维护状态和页信息的过程.因为Web应用程序的通信协议使用了无状态的HTTP协议,所以当客户端请求页面时,ASP.NET服务器端都会重新生 ...

  5. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  6. Python Socket 简单聊天室2

    上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  7. Node.js+websocket+mongodb实现即时聊天室

    ChatRoom Node.js+websocket+mongodb实现即时聊天室 A,nodejs简介:Node.js是一个可以让javascript运行在服务器端的平台,它可以让javascrip ...

  8. SpringBoot 搭建简单聊天室

    SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...

  9. 利用socket.io+nodejs打造简单聊天室

    代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

随机推荐

  1. NOPI 导出 Excel 2007

    代码: public static void ThisTo<T>( List<T> source, string[] colums, Func<T, object[]&g ...

  2. Java复习第二天

    Day04 1.switch语句的格式?针对格式的解释?以及注意事项? (1)格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; ...

  3. 【3】.net MVC 使用IPrincipal进行Form登录即权限验证

    1.在MVC项目中添加用户类,可以根据实际项目需求添加必要属性 public class UserData { /// <summary> /// ID /// </summary& ...

  4. openlayers 4快速渲染管网模型数据

    1.背景 项目需要将管网模型运行的结果数据在矢量地图上以不同颜色加以区分.结果数据中和图层数据中唯一能对应的只有一个标识. 2.实现思路 利用定时器+图层统一渲染.在style上找到突破口,而不是用常 ...

  5. vsphere client 创建虚拟机 如何关联到本地iso文件

    问题:以前用过vmere 创建虚拟机,都要在虚拟机启动之前配置系统镜像文件,第一次使用vspere client时在创建虚拟机后,我就想着应该先配置,再启动,其实,非也,应该这样,先启动虚拟机,在点按 ...

  6. Python之异常设计(一)

    一 定义 异常分为两类:一类是自动触发异常如除零错误:另一类是通过raise触发. 二 为什么要使用异常 当程序运行时,如果检测到程序错误,Python就会引发异常,我们可以在程序中使用try语句捕获 ...

  7. 重构指南 - 封装条件(Encapsulate Conditional)

    封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用.   当代码中包含 ...

  8. Python-网络编程(一)

    首先我们python基础部分已经学完了,而socket是我们基础进阶的课程,也就是说,你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引 ...

  9. 纯css面板插件,自适应,多样式

    最近在做公司的系统后台,用的bootstrap,在设计布局的时候不喜欢他的面板,所以自己写了这个面板插件,分享给大家 先上预览图: 默认样式: 绿色: 黄色: 蓝: 红: 使用方法: 引用MoUi.c ...

  10. 项目经验:GIS<MapWinGIS>建模第五天

    实现连能性的分析,及分析完成后,针对独立的块区域进行管网的修补工作 实现步骤如下图所示: