asp.net web 通过IHttpAsyncHandler接口进行消息推送

1.创建Comet_by_ASP.NET web项目
2.handler类和result类
namespace Handle
{
    /// <summary>
    /// Summary description for AsnyHandler
    /// </summary>
    public class AsnyHandler : IHttpAsyncHandler
    {
        public AsnyHandler()
        {
        }

        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            //myAsynResult为实现了IAsyncResult接口的类,当不调用cb的回调函数时,该请求不会返回到给客户端,会一直处于连接状态
            myAsynResult asyncResult = new myAsynResult(context, cb, extraData);
            String content = context.Request.Params["content"];

            //向Message类中添加该消息
            Messages.Instance().AddMessage(content, asyncResult);
            return asyncResult;
        }

        #region 不必理会

        public void EndProcessRequest(IAsyncResult result)
        {

        }

        public bool IsReusable
        {
            get { return false; ; }
        }

        public void ProcessRequest(HttpContext context)
        {
        }
        #endregion
    }
    public class myAsynResult : IAsyncResult
    {
        bool _IsCompleted = false;
        private HttpContext context;
        private AsyncCallback cb;
        private object extraData;
        public myAsynResult(HttpContext context, AsyncCallback cb, object extraData)
        {
            this.context = context;
            this.cb = cb;
            this.extraData = extraData;
        }
        private string _content;
        public string Content
        {
            get { return _content; }
            set { _content = value; }
        }

        #region IAsyncResult接口
        public object AsyncState
        {
            get { return null; }
        }

        public System.Threading.WaitHandle AsyncWaitHandle
        {
            get { return null; }
        }

        public bool CompletedSynchronously
        {
            get { return false; }
        }
        public bool IsCompleted
        {
            get { return _IsCompleted; }
        }
        #endregion

        //在Message类中的添加消息方法中,调用该方法,将消息输入到客户端,从而实现广播的功能
        public void Send(object data)
        {
            context.Response.Write(this.Content);
            if (cb != null)
            {
                cb(this);
            }
            _IsCompleted = true; ;
        }
    }
}
3.Messages类
using Handle;
using System;
using System.Collections.Generic;
using System.Web;
namespace Handle
{
    /// <summary>
    /// Summary description for Messages
    /// </summary>
    public class Messages
    {
        //记录所有请求的客户端
        List<myAsynResult> clients = new List<myAsynResult>();

        #region 实现该类的单例
        private static readonly Messages _Instance = new Messages();
        private Messages()
        {
        }
        public static Messages Instance()
        {
            return _Instance;
        }
        #endregion

        public void AddMessage(string content, myAsynResult asyncResult)
        {
            //当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接
            //此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,该连接将会被遍历,并且会将该连接输出内容后,结束该连接
            if (content == "-1")
            {
                clients.Add(asyncResult);
            }
            else
            {
                //将当前请求的内容输出到客户端
                asyncResult.Content = content;
                asyncResult.Send(null);

                //否则将遍历所有已缓存的client,并将当前内容输出到客户端
                foreach (myAsynResult result in clients)
                {
                    result.Content = content;
                    result.Send(null);
                }

                //清空所有缓存
                clients.Clear();
            }
        }
    }
}
4.Default.aspx
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        *{ font-size:12px;}
        #divResult
        {
             border:1px solid #000;
             width:250px;
        }
    </style>
    <script type="text/javascript" src="Scripts/jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="Scripts/myJS.js"></script>
</head>
<body>
      广播内容:  <input type="text" id="content" /><br />
      消息记录:
        <div id="divResult"></div>
        <input type="button" id="btnSend" value="广播" />
</body>
</html>
5.myjs类
/// <reference path="jquery-1.3.2.min.js" >
$(document).ready(function () {
    function send() {
        //向comet_broadcast.asyn发送请求,消息体为文本框content中的内容,请求接收类为AsnyHandler
        $.post("comet_broadcast.asyn", { content: $("#content").val() });

        //清空内容
        $("#content").val("");
    }

    function wait() {
        $.post("comet_broadcast.asyn", { content: "-1" },
         function (data, status) {
             var result = $("#divResult");
             result.html(result.html() + "<br/>" + data);

             //服务器返回消息,再次立连接
             wait();
         }, "html"
         );
    }

    //初始化连接
    wait();

    $("#btnSend").click(function () { send(); });
    $("#content").keypress(function (event) {
        if (event.keyCode == 13) {
            send();
        }
    });
});
6.web.config
IIS经典模式配置
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="FormsAuthentication" />
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules>
     <handlers>
      <add name="comet_broadcast" path="comet_broadcast.asyn" type="Handle.AsnyHandler" verb="POST,GET"/>
    </handlers>
    <validation validateIntegratedModeConfiguration="false" />
  </system.webServer>
兼容旧版iis
<system.web>
     <httpHandlers>
       <add name="comet_broadcast" path="comet_broadcast.asyn" type="Handle.AsnyHandler" verb="POST,GET"/>
      </httpHandlers>
</system.web>
7.最后恭祝你身体健康,万事如意。
时间: 2024-11-01 10:57:20

asp.net web 通过IHttpAsyncHandler接口进行消息推送的相关文章

SignalR SelfHost实时消息,集成到web中,实现服务器消息推送

先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.SelfHostMicrosoft.Owin.Cors 在Program.cs添加代码 添加一个Hub 这个hub里面我们就实现了连接时候服务器像客户端推送一条消息,客户端接收方法为receive下面我又给这个hub添加了一个send方法,客户端发送消息来的时候会把消息广播到所有客户端去,代码如下:

Asp.net SignalR 实现服务端消息推送到Web端

原文:http://www.cnblogs.com/wintersun/p/4148223.html 之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我们来实现服务端消息推送到Web端,   首先回顾一下它抽象层次图是这样的: 实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加简单. 为了获取更好的可伸缩性, 我们引入消息队列, 看如下

友盟消息推送

博主也是第一次使用友盟消息推送,其中的配置我也不需要多讲,在这里附上iOS客户端友盟消息推送的集成文档,并讲讲个人使用心得 iOS友盟消息推送集成文档 这里既有集成文档的讲解步骤,还有证书配置的指南,只需要按照步骤集成即可. 1.配置服务器地址 友盟消息推送后台:适配iOS9,在info.plist文件中按截图配置 以iOS9 SDK编译的工程会默认以SSL安全协议进行网络传输,即HTTPS,如果依然使用HTTP协议请求网络会报系统异常并中断请求.目前可用如下两种方式保持用HTTP进行网络连接:

service worker 消息推送

https://developers.google.com/web/fundamentals/codelabs/push-notifications/?hl=en 首先下载源码: git clone https://github.com/GoogleChrome/push-notifications.git 设置如下选项方便开发: 开始 注册之后记录sw实例: navigator.serviceWorker.register('sw.js') .then(function(swReg) { co

AngularJS+ASP.NET MVC+SignalR实现消息推送

原文:http://www.mincoder.com/article/4565.shtml 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现的是firebase,于是很兴奋的开始倒腾起来.firebase用 起来倒是简单:引用一个js即可,按官网上的教程很快便应用到了项目中.第二天打开项目发现推送功能不好使了,这是为何?最后发现firebase官网打 不开了...难道firebase被google收了也会被天朝给墙掉?也许

实现web消息推送的技术和采用长轮询corundumstudio介绍

实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端. 有哪些可以实现web消息推送的技术: 不断地轮询(俗称“拉”,polling)是获取实时消息的一个手段:Ajax 隔一段时间(通常使用 JavaScript 的 setTimeout 函数)就去服务器查询是否有改变,从而进行增量式的更新.但是间隔多长时间去查询成了问题,因为性能和即

利用Hessian10分钟配置出一个简单的跨Web服务消息推送

笔者,之前对Web跨服务推送数据一无所知,今天研究了一下.其实有些事物,在不理解的时候完全觉得好似天外来物.但了解一点点之后,又会觉得十分有趣.每天闲扯一下很开心,下面一个简单的实例10分钟配置出跨Web服务的消息推送.一.被调用端web.xml配置 <!--HelloHessian --> <servlet> <servlet-name>HelloHessian</servlet-name> <servlet-class>com.caucho.

Spring Boot 二三事:WEB 应用消息推送的那点事

阅读对象:本文适合SpringBoot 初学者及对SpringBoot感兴趣的童鞋阅读. 背景介绍:在企业级 WEB 应用开发中,为了更好的用户体验&提升响应速度,往往会将一些耗时费力的请求 (Excel导入or导出,复杂计算, etc.) 进行异步化处理. 由此带来的一个重要的问题是如何通知用户任务状态,常见的方法大致分为2类4种: HTTP Polling client pull HTTP Long-Polling client pull Server-Sent Events (SSE) s

VDN For PB Web实现消息推送

利用VesnData.Net(VDN)的互联网数据驱动功能我们实现了PB连接互联网数据库的功能.在互联网开发的过程中我们往往有些消息或者数据希望即时能够通知到各个客户端,现在比较流行的一种技术就是消息推送,现在PB就可以利用VDN来实现消息的推送. 1.  首先在窗口里放置一个uo_VDNCore 组件,设置一下URL.DesKey.SN属性 2.  增加一个登录按钮,实现消息在线的登录.因为VDNCore已经封装好了这些功能,所以实现很简单.这里我们还可以获取服务器端返回的客户端的IP地址和唯