一、简介

  在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 推送的更多相关文章

  1. Asp.net MVC Comet推送

    一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回. 客户 ...

  2. 【转】Asp.net MVC Comet推送

    原文链接:http://www.cnblogs.com/kissdodog/p/4283485.html 一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发 ...

  3. WinForm中 Asp.Net Signalr消息推送测试实例

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  4. C#—ASP.NET:集成极光推送(Push API v3)

    C#—ASP.NET:集成极光推送(Push API v3) 原文地址: https://blog.csdn.net/CXLLLK/article/details/86489994   1.极光推送官 ...

  5. comet 推送消息到客户端

    weiconfig: <system.web> <httpHandlers> <add path="comet_broadcast.ashx" typ ...

  6. 基于comet服务器推送技术(web实时聊天)

    http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将 ...

  7. [译]servlet3.0与non-blocking服务端推送技术

    Non-blocking(NIO)Server Push and Servlet 3 在我的前一篇文章写道如何期待成熟的使用node.js.假定有一个框架,基于该框架,开发者只需要定义协议及相关的ha ...

  8. web推送

    WEB消息推送框架 web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接通讯,如果浏览器不支持WebSocket则自动转用comet推 ...

  9. workman即时推送

    https://www.workerman.net/web-sender 下载源码解压后运行  start_for_win.bat  如果提示不成功,就把php路径配置到环境变量中去即可 运行后打开浏 ...

随机推荐

  1. git使用多个SSH公钥信息

    常常在开发环境存在多个git库,比如官方的github.公司搭建的gitlab.自己的私人库等等多个git库,为了方便使用,git需要配置多个SSH公钥信息. 在centos7.5下,进入用户目录,以 ...

  2. 20145335郝昊《网络对抗》逆向及Bof基础实践

    20145335郝昊<网络对抗>逆向及Bof基础实践 1.实践说明 本次实践是对一个名为pwn1的可执行Linux文件进行操作.程序的执行流程是:主函数main调用foo函数,foo将函数 ...

  3. LA 7277 Landscaping(最小割)

    https://vjudge.net/problem/UVALive-7277 题意: 给出一个n*m的地图,.代表低坡,#代表高坡. 现在有n+m辆车分别从上端和左端出发,如果在行驶的过程中需要转换 ...

  4. 调用libpci库出现的问题和解决方法

    调用libpci库出现的问题和解决方法   本方案以pciutils-3.5.1为例.   1. 从以下地址下载pciutils-3.5.1.tar.xz https://www.kernel.org ...

  5. /msgsrvmgr.cpp:4:26: fatal error: kdl/frames.hpp: No such file or directory #include <kdl/frames.hpp>

    /home/xxx/ros_workspace/src/bp_protocol_bridge/protospot/src/msgsrvmgr.cpp::: fatal error: kdl/frame ...

  6. dva subscription的使用方法

    import { routerRedux } from 'dva/router' export default { namespace: 'notice', state: { notices:[], ...

  7. 2018HN多校

    http://acm.hi-54.com/contest_problemset.php?cid=1455 A : 摩斯密码 概览问题列表状态排名 Progress Bar 时间限制:1 Sec 内存限 ...

  8. Linux下weblogic启动报错unable to get file lock的问题

    非正常结束weblogic进程导致weblogic无法启动 由于先前服务器直接down掉了,所有进程都非正常的进行关闭了,也就导致了下次启动weblogic的时候报了以下错误:<2012-3-2 ...

  9. Xcode6中手动添加Precompile Prefix Header

    Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件,开发的过程中可以将广泛使用的头文件以及宏包含在该文件下,编译器就会 ...

  10. 加密算法中涉及C/C++总结

    学习网站:http://www.runoob.com/cplusplus/cpp-functions.html char在VC(c++)中占1字节(byte),8位(bit). int在VC(c++) ...