Asp.net MVC Comet 推送
一、简介
在Asp.net MVC实现的Comet推送的原理很简单。
服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回。
客户端:请求异步Action,当接收到一个返回时,立即又再发送一个。
缺点:会长期占用一个Asp.net处理线程。但相比于轮询,其节省了带宽。
示例:
新建一个Controller如下:
//Comet服务器推送控制器(需设置NoAsyncTimeout,防止长时间请求挂起超时错误)
[NoAsyncTimeout, SessionState(SessionStateBehavior.ReadOnly)]
public class CometController : AsyncController //需要继承自异步的AsyncController
{
/// <summary>
/// 异步方法,处理客户端发起的请求
/// </summary>
public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment();
AsyncManager.Parameters["info"] = "怎么了";
AsyncManager.OutstandingOperations.Decrement();
} /// <summary>
/// 当异步线程完成时向客户端发送响应
/// </summary>
/// <param name="token">数据封装对象</param>
/// <returns></returns>
public ActionResult IndexCompleted(string info)
{
return Json(info, JsonRequestBehavior.AllowGet);
}
}
随便找一个页面,通过AJAX请求这一个异步Action:
<html>
<head>
<title>AJAX测试</title>
<script src="/Content/jquery-1.10.2.min.js"></script>
<script type="text/javascript">
$(function () {
getCometServerPush();
}) function getCometServerPush() {
$.ajax({
cache: false,
url: '/Comet/Index',
success: function (data) {
$("#info").html(data);
getCometServerPush();
}
});
} </script>
</head>
<body>
<div id="info"></div>
</body>
</html>
上面的示例,如果你在Action上下一个断点,会不停的看到断点在循环。说明异步客户端不停地在推送。当然这个示例仅仅是说明推送的原理。
二、应用
应用:监控服务器上的一个txt文件,当有变化时,推送内容到客户端。
//Comet服务器推送控制器(需设置NoAsyncTimeout,防止长时间请求挂起超时错误)
[NoAsyncTimeout, SessionState(SessionStateBehavior.ReadOnly)]
public class CometController : AsyncController //需要继承自异步的AsyncController
{
/// <summary>
/// 异步方法,处理客户端发起的请求
/// </summary>
public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment(); FileSystemWatcher FSW = new FileSystemWatcher();
FSW.Filter = "123.txt"; //仅仅监控123.txt文件
FSW.Path = Server.MapPath(@"/"); //设置监控路径
FSW.EnableRaisingEvents = true; //启动监控
//FileSystemWatcher暂时有个多次触发的问题,但与本推送示例无关,故不解决
FSW.Changed += (object source, FileSystemEventArgs e) =>
{
AsyncManager.Parameters["info"] = System.IO.File.ReadAllText(Server.MapPath(@"/123.txt"),System.Text.Encoding.Default); ;
AsyncManager.OutstandingOperations.Decrement();
};
} /// <summary>
/// 当异步线程完成时向客户端发送响应
/// </summary>
/// <param name="token">数据封装对象</param>
/// <returns></returns>
public ActionResult IndexCompleted(string info)
{
return Json(info, JsonRequestBehavior.AllowGet);
}
}
Asp.net MVC Comet 推送的更多相关文章
- Asp.net MVC Comet推送
一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回. 客户 ...
- 【转】Asp.net MVC Comet推送
原文链接:http://www.cnblogs.com/kissdodog/p/4283485.html 一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发 ...
- WinForm中 Asp.Net Signalr消息推送测试实例
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- C#—ASP.NET:集成极光推送(Push API v3)
C#—ASP.NET:集成极光推送(Push API v3) 原文地址: https://blog.csdn.net/CXLLLK/article/details/86489994 1.极光推送官 ...
- comet 推送消息到客户端
weiconfig: <system.web> <httpHandlers> <add path="comet_broadcast.ashx" typ ...
- 基于comet服务器推送技术(web实时聊天)
http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将 ...
- [译]servlet3.0与non-blocking服务端推送技术
Non-blocking(NIO)Server Push and Servlet 3 在我的前一篇文章写道如何期待成熟的使用node.js.假定有一个框架,基于该框架,开发者只需要定义协议及相关的ha ...
- web推送
WEB消息推送框架 web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接通讯,如果浏览器不支持WebSocket则自动转用comet推 ...
- workman即时推送
https://www.workerman.net/web-sender 下载源码解压后运行 start_for_win.bat 如果提示不成功,就把php路径配置到环境变量中去即可 运行后打开浏 ...
随机推荐
- 前端学习笔记之CSS文档流
先引用一段W3C的文档: 9.3 Positioning schemes In CSS 2.1, a box may be laid out according to three positionin ...
- 实时刷新winform中的某一个控件上的文字
需要注意的是,必须从UI线程,另外启动一个线程才可以. 在新线程调用异步刷新就OK了 Thread thread; private void button1_Click(object sender, ...
- BZOJ 3122 【SDOI2013】 随机数生成器
题目链接:随机数生成器 经典数学题…… 为了方便接下来的处理,我们可以先把\(X_1=t\)的情况特判掉. 当\(a=0\)的时候显然只需再判一下\(b\)是否等于\(t\)即可. 当\(a=1\)的 ...
- 如何基于Netty处理粘包、拆包问题?
涉及到相关重要组件: ByteToMessageDecoder MessageToMessageDecoder 这两个组件都实现了ChannelInboundHandler接口,这说明这两个组件都是用 ...
- C#通过WMI读取MAC地址
该方法依赖WMI的系统服务,该服务一般不会被关闭;但如果系统服务缺失或者出现问题,该方法无法取得MAC地址,需要重启Windows Management Instrumentation服务. publ ...
- canvas绘制进度条(wepy)
<template> <canvas canvas-id="canvas" style="width:{{width+10}}px;height:{{w ...
- [转载]SQL语句练习
.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 思路: 获取所有有生物课程的人(学号,成绩) - 临时表 获取所有有物理课程的人(学号,成绩) - 临时表 根据[学号]连接两个临时表: 学号 ...
- Gitlab项目用ssh克隆
Gitlab项目用ssh克隆 1. 新建一个文件夹并用git bash here 打开 2. 在git bash here 输入命令行 ssh-keygen –t rsa –C“邮箱名” 3. ...
- h5桌面通知Notification
H5中的桌面通知Notification 前言: 对于一个前端开发者,逛网页总会留意一些新奇的功能,对于上班总会用到Teambition的我,总是能收到Notification...所以今天就来研究下 ...
- 修改oracle字符集合
SQL> conn /as sysdbaSQL> shutdown immediate;SQL> startup mountSQL> ALTER SYSTEM ENABLE R ...