.消息类,可直接通过这个类推送消息 HttpMessages
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace Holworth.Utility
{
public class HttpMessages
{
//记录所有请求的客户端
List<WebAsynResult> clients = new List<WebAsynResult>(); #region 实现该类的单例
private static readonly HttpMessages _Instance = new HttpMessages();
private HttpMessages()
{
}
public static HttpMessages Instance()
{
return _Instance;
}
#endregion public void AddMessage(string content, WebAsynResult asyncResult)
{
//当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接
//此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,该连接将会被遍历,并且会将该连接输出内容后,结束该连接
if (content == "-1")
{
clients.Add(asyncResult);
}
else
{
//将当前请求的内容输出到客户端
asyncResult.Content = content;
asyncResult.Send(null); //否则将遍历所有已缓存的client,并将当前内容输出到客户端
foreach (WebAsynResult result in clients)
{
result.Content = content;
result.Send(null);
} //清空所有缓存
clients.Clear();
}
}
}
}
.异步请求接口WebAsnyHandler实现类
using System;
using System.Collections.Generic;
using System.Web;
using System.Threading; namespace Holworth.Utility
{
/// <summary>
/// Summary description for AsnyHandler
/// </summary>
public class WebAsnyHandler : IHttpAsyncHandler
{
public WebAsnyHandler()
{
} public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
//myAsynResult为实现了IAsyncResult接口的类,当不调用cb的回调函数时,该请求不会返回到给客户端,会一直处于连接状态
WebAsynResult asyncResult = new WebAsynResult(context, cb, extraData);
String content = context.Request.Params["content"]; //向Message类中添加该消息
HttpMessages.Instance().AddMessage(content, asyncResult);
return asyncResult;
} #region 不必理会 public void EndProcessRequest(IAsyncResult result)
{ } public bool IsReusable
{
get { return false; ; }
} public void ProcessRequest(HttpContext context)
{
}
#endregion
} }
.异步请求结果类WebAsynResult
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web; namespace Holworth.Utility
{
public class WebAsynResult : IAsyncResult
{
bool _IsCompleted = false;
private HttpContext context;
private AsyncCallback cb;
private object extraData;
public WebAsynResult(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; ;
}
}
}
.客户端 请求分两步 发送数据send和等待数据的请求,若有数据则响应继续进入等待数据的状态,若无数据进入等待状态,异步接口缓存客户端的异步请求结果
js部分
/// <reference path="jquery-1.3.2.min.js" >
function send(content) {
// alert("step=" + $("#content").val());
//var content = getUrlParam("step");
//向comet_broadcast.asyn发送请求,消息体为文本框content中的内容,请求接收类为WebAsnyHandler
$.post("comet_broadcast.asyn", { content: content }); //清空内容
$("#content").val("");
}
function getUrlParam(pName, win) {
var sUrl;
if (typeof (win) == 'string') {
sUrl = win;
if (sUrl.indexOf('?') < ) sUrl = '?' + sUrl;
} else {
if (!win) win = window;
sUrl = win.location.search;
}
var iQ = sUrl.indexOf('?') + ;
if (iQ > ) {
sUrl = '&' + sUrl.substring(iQ, sUrl.length); iQ = sUrl.indexOf('?'); //url参数中还存在url?
var key = '&' + pName + '=';
var i = sUrl.indexOf(key);
if (i > -) {
var j = sUrl.indexOf('&', i + ); //&Key=Val&Key2=...
if (j < || (iQ > && j > iQ)) j = sUrl.length;
return unescape(sUrl.substring(i + key.length, j));
}
}
return null;
}; //未找到服务响应的客户端进入等待状态,待服务端响应之后,再次等待,一直循环
function wait() {
// alert("初始化前")
$.post("comet_broadcast.asyn", { content: "-1" },
function (data, status) {
var result = $("#divResult");
result.html(result.html() + "<br/>" + data);
// alert("初始化后")
//服务器返回消息,再次立连接
wait();
}, "html"
);
} $(function () {
//初始化连接
wait(); //测试代码
$("#btnSend").click(function () { send($("#content").val()); });
$("#content").keypress(function (event) {
if (event.keyCode === ) {
send($("#content").val());
}
});
}); 。这里在另一个页面进行数据的推送,不过是service还是页面都可以
LongConnectServer.aspx,前台部分无关紧要,直接看后台调用
using Holworth.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace Comet_by_ASP.NET
{
public partial class LongConnectServer : System.Web.UI.Page
{
public void aa()
{
for (int i = ; i < ; i++)
{ }
}
public void bb()
{
WebAsynResult asyncResult = new WebAsynResult(HttpContext.Current, null,null);
HttpMessages.Instance().AddMessage("", asyncResult);
Thread.Sleep();
HttpMessages.Instance().AddMessage("", asyncResult);
Thread.Sleep();
HttpMessages.Instance().AddMessage("", asyncResult);
Thread.Sleep();
HttpMessages.Instance().AddMessage("", asyncResult);
Thread.Sleep();
HttpMessages.Instance().AddMessage("", asyncResult);
Thread.Sleep();
HttpMessages.Instance().AddMessage("", asyncResult);
//WebRequestUtility req = new WebRequestUtility();
//var para = new Dictionary<string, string>();
//para.Add("_method", "compute");
//para.Add("step", "1"); //req.HttpGet("http://localhost:12688/Default2.aspx", para);
//return;
//para.Clear();
//// //para.Add("_method", "compute");
//para.Add("step", "2");
//req.HttpGet("http://localhost:12688/Default2.aspx", para); //return;
////
//para.Clear();
//para.Add("_method", "compute");
//para.Add("step", "3");
//req.HttpGet("http://localhost:12688/Default2.aspx", para); ////
//para.Clear();
//para.Add("_method", "compute");
//para.Add("step", "4");
//req.HttpGet("http://localhost:12688/Default2.aspx", para); ////
//para.Clear();
//para.Add("_method", "compute");
//para.Add("step", "5");
//req.HttpGet("http://localhost:12688/Default2.aspx", para); ////
//para.Clear();
//para.Add("_method", "compute");
//para.Add("step", "6");
//req.HttpGet("http://localhost:12688/Default2.aspx", para);
}
protected void Page_Load(object sender, EventArgs e)
{
bb(); }
}
}
.长连接客户端 LongConnectClinet
6.1 html
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LongConnectClient.aspx.cs" Inherits="Comet_by_ASP.NET.LongConnectClient" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<style type="text/css">
*{ font-size:12px;}
#divResult
{
border:1px solid #;
width:250px;
}
</style>
<script src="/Scripts/jquery.min.1.11.3.js"></script>
<script src="/Scripts/WebAsync.js"></script>
</head>
<body>
<form runat="server" id="form1">
广播内容: <input type="text" id="content" /><br />
消息记录:
<div id="divResult"></div>
<input type="button" id="btnSend" value="广播" />
</form>
</body>
</html>
6.2 后台代码 这里的代码无关紧要
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace Comet_by_ASP.NET
{
public partial class LongConnectClient : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//switch (Request["_method"])
//{
// case "compute":
// Page.ClientScript.RegisterClientScriptBlock(this.GetType(), Guid.NewGuid().ToString(), "<script>wait();send();</script>");
// break;
//}
}
}
} .web.config
<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.WebAsnyHandler" verb="POST,GET"/>
</handlers>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>

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

  1. asp.net mvc 实现简单的实时消息推送

    因为项目需要,需要在网页上实现消息的推送.在百度上搜索了一下,发现实现网页上的消息推送,可以使用asp.net 中的SignalR类库,当然也可以使用H5的WebSocket  Ajax的轮回.当然此 ...

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

    先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...

  3. Web端即时通讯、消息推送的实现

    https://blog.csdn.net/DeepLies/article/details/77726823

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

              之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我 ...

  5. 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)

    1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...

  6. How Javascript works (Javascript工作原理) (九) 网页消息推送通知机制

    个人总结: 1.介绍了网页消息推送通知机制 全文地址:https://github.com/Troland/how-javascript-works 这是 JavaScript 工作原理的第九章. 现 ...

  7. service worker 消息推送

    https://developers.google.com/web/fundamentals/codelabs/push-notifications/?hl=en 首先下载源码: git clone ...

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

    原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现 ...

  9. java版Web Socket,实现消息推送

    # web socket是什么? WebSocket协议是基于TCP的一种新的网络协议. 它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动发送信息给客户端. ## 用途 实时 ...

随机推荐

  1. jQuery id模糊 选择器 批量处理

    $("span[id^='province_']").each(function(index,obj){        $(obj).bind("click", ...

  2. 58. :CREATE UNIQUE INDEX 终止,因为发现对象名称 'dbo.tSysParam' 和索引名称 'PK_tSysParam' 有重复的键

    更改实体对应表结构失败[修改实体对象表结构失败[修改表[tSysParam]的主键信息失败:CREATE UNIQUE INDEX 终止,因为发现对象名称 'dbo.tSysParam' 和索引名称 ...

  3. EventUtil——跨浏览器的事件对象

    . 首页 博客园 联系我 前言:什么是EventUtil?. EventUtil对象全见. addHandler方法. removeHandler方法. event对象与getEvent方法. tar ...

  4. CSS镂空图片处理

    来源:http://www.zhangxinxu.com/wordpress/?p=5267,分享收藏 使用镂空图片,通过CSS改变颜色,达到图片切换的效果,可以同过背景图,然后改变背景色,从而达到图 ...

  5. sql 数据库修复

    数据库修复 exec sp_dboption 'dbname1','single user',‘true’ dbcc checkdb('dbname1') dbcc checkdb('dbname1' ...

  6. ABAP-HTML浏览器

  7. ios localization

    1. 在工程文件中选择支持的语言,“Localizations” 2. 添加资源文件 Localizable.strings, (app默认从该资源文件读取字符串) 3. 通过 NSLocalized ...

  8. mongodb基础学习14-mapReduce操作

    mapReduce随着大数据的兴起而流行,相当于传统数据库的group操作,强项在于分布式计算. map:将一组记录的相关信息映射到一个数组 reduce:对map得到的数组数据进行处理得到一个结果 ...

  9. PostgreSql别名区分大小写的问题

    PostgreSql是区分大小写的,如果别名的大小不一致就会提示错误: SELECT * FROM ( SELECT cpi."product_item_id" "PRO ...

  10. scala -- 层级

    层级 层级的顶端是Any 类,定义了如下方法 final def ==(that:Any):Boolean final def !=(that:Any):Boolean def equals(that ...