设为首页 收藏本站
查看: 1187|回复: 0

[经验分享] 基于Redis的ASP.NET与js(AJAX)的聊天程序

[复制链接]

尚未签到

发表于 2016-12-21 08:37:51 | 显示全部楼层 |阅读模式
  首先是安装Redis, 此处略过n步...
  

  然后,新建一个ASP.NET的MVC2的工程《MvcMessage》,需要下载ServiceStack.Redis并把dll复制到工程下,并正确引用。
  

  好,下面开始贴代码了:
  1. 在工程目录《Models》下新建类:Message.cs
  using System;using System.Collections.Generic;using System.ComponentModel;using System.ComponentModel.DataAnnotations;using System.Globalization;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Security;namespace MvcMessage.Models{//modelpublic class Message{public long Id { get; set; }public string SendName { get; set; }public string SendTo { get; set; }public DateTime SendTime { get; set; }public string Msg { get; set; }public int SendType { get; set; }}}
2. 在工程目录《Controllers》下新建控制器:MessageController.cs
  using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Threading;using ServiceStack.Redis;using MvcMessage.Models;namespace MvcMessage.Controllers{public class MessageController : AsyncController{static private Mutex mutex = new Mutex();//不了解的可以去看资料,这里不说了static RedisClient redisClient = new RedisClient("172.18.1.240");//redis的IP,端口默认的则不用写public ActionResult Index(){return View();}public void SendMessageAsync(){mutex.WaitOne();try{using (var msgs = redisClient.GetTypedClient<Message>())//Redis消息对象{var m = new Message{Id = msgs.GetNextSequence(),Msg = HttpContext.Request["msg"],SendTime = Convert.ToDateTime(HttpContext.Request["time"]),SendType = Convert.ToInt32(HttpContext.Request["type"]),SendTo = HttpContext.Request["to"],SendName = HttpContext.Request["from"]};if (m.SendType == 1){m.SendTo = "All";}msgs.Store(m);//保存到Redismsgs.ExpireAt(m.Id, DateTime.Now.AddSeconds(60 * 1000));//redis记录的过期AsyncManager.Parameters["ret"] = new//构造返回对象格式{code = 200,ret = "Send OK!",what = ""};AsyncManager.OutstandingOperations.Decrement();//触发SendMessageCompleted的执行}}catch (Exception ex){//错误处理AsyncManager.Parameters["ret"] = new{code = 500,ret = "",what = "Send error:"+ex.Message};AsyncManager.OutstandingOperations.Decrement();}mutex.ReleaseMutex();}public ActionResult SendMessageCompleted(object ret){//返回JSON对象return Json(ret, JsonRequestBehavior.AllowGet);}public void GetMessageAsync(){mutex.WaitOne();try{DateTime lastTime = Convert.ToDateTime(HttpContext.Request["time"]);string user = HttpContext.Request["sendName"];using (var msgs = redisClient.GetTypedClient<Message>()){var msgFromRedis = msgs.GetAll().Where<Message>(msg => msg.SendTime > lastTime && (msg.SendTo == user|| msg.SendType == 1)&& msg.SendName != user);//从Redis取数据,并设置查询条件var list = msgFromRedis.ToList<Message>();//查询结果IDictionary<string, object> ret = new Dictionary<string, object>();ret.Add("code", 200);//成功码ret.Add("ret", list);//返回结果ret.Add("what", "");AsyncManager.Parameters["ret"] = ret;//返回对象格式AsyncManager.OutstandingOperations.Decrement();//触发GetMessageCompleted的执行}}catch (Exception ex){//错误处理IDictionary<string, object> ret = new Dictionary<string, object>();ret.Add("code", 500);//失败码ret.Add("ret", "");ret.Add("what", ex.Message);//错误内容AsyncManager.Parameters["ret"] = ret;AsyncManager.OutstandingOperations.Decrement();}mutex.ReleaseMutex();}public ActionResult GetMessageCompleted(IDictionary<string, object> ret){//返回JSON对象return Json(ret, JsonRequestBehavior.AllowGet);}}}
3. 在《Global.asax.cs》文件中注册Routes方法改为:
          public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default", // 路由名称"{controller}/{action}/{id}", // 带有参数的 URLnew { controller = "Message", action = "Index", id = UrlParameter.Optional } // 参数默认值);}4. 为Message控制器创建视图:《/Views/Message/Index.aspx》
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %><asp:Content ID="Content3" ContentPlaceHolderID="HeaderContent" runat="server"><script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script><script src="../../Scripts/Message.js" type="text/javascript"></script><style type="text/css">#logs{width: 360px;height: 200px;}</style></asp:Content><asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">Index</asp:Content><asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"><h2>Index</h2><textarea id="logs">waiting...</textarea><div id="sendBox"><br />昵称:<input type="text" id="sendName" name="sendName" value="" />发送给:<input type="radio" id="sendType1" name="sendType" checked="checked" value="1" />所有人发送给:<input type="radio" id="sendType2" name="sendType" value="0" /><input type="text" id="sendTo" name="sendTo" value="" />内容:<input type="text" id="message" name="message" value="" /><br /><input type="submit" id="send" value="发送" /></div></asp:Content>5. 《Message.js》的内容:
  //var i = 0;var lastTime = new Date();//首次打开网页时会以此时间开始取消息$(document).ready(function () {$.ajaxSetup({ cache: false });setInterval('long_polling(false)',5000);//每隔5秒取一次消息});//接收function long_polling(s) {if (s) i++;var sendname = $('#sendName').val();var sendtype = $('#sendType1').attr("checked") ? 1 : 0;var sendto = $('#sendTo').val();var msg = $('#message').val();var t = DateToString(lastTime);$.ajax({url: '/Message/GetMessage',data: { 'sendName': sendname, 'time': t },dataType: 'json',error: function () { long_polling(false); },success: function (data) {if (data.code == 200) {var d;for (var item in data.ret) {if (data.ret[item].Msg) {d = ConvertJSONDateToJSDateObject(data.ret[item].SendTime);$('#logs').val(data.ret[item].SendName + "[" + DateToString(d) + "]对[" + (data.ret[item].SendType == 1 ? '所有人' : data.ret[item].SendTo) + "]说: " + data.ret[item].Msg + "\n" + $("#logs").val());lastTime = d;//更新最后一个消息的时间}}} else {$("#logs").val('error:' + data.what + '\n' + $("#logs").val());}}});}//发送function sendMsg() {var sendname = $('#sendName').val();var sendtype = $('#sendType1').attr("checked") ? 1 : 0;var sendto = $('#sendTo').val();var msg = $('#message').val();var d = new Date();var t = DateToString(d);$.ajax({url: '/Message/SendMessage',data: { 'from': sendname, 'type': sendtype, 'to': sendto, 'msg': msg, 'time': t },dataType: 'json',success: function (data) {if (data.code == 200) {$("#logs").val(data.ret + '\n' + $("#logs").val());}else {$("#logs").val(data.what + '\n' + $("#logs").val());}}});}//时间转换function ConvertJSONDateToJSDateObject(JSONDateString) {var date = new Date(parseInt(JSONDateString.replace("/Date(", "").replace(")/", ""), 10));return date;}function DateToString(d) {var t = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();return t;}
ServiceStack.Redis的资料,实在是太少了,这篇文章算是研究Redis与C#应用的一个实例吧!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-317125-1-1.html 上篇帖子: Redis官方文档(15) ——高可用(上) 下篇帖子: 使用redisco轻松将python内置数据类型存入redis内
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表