asp.net web 通过IHttpAsyncHandler接口进行消息推送
.消息类,可直接通过这个类推送消息 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接口进行消息推送的更多相关文章
- asp.net mvc 实现简单的实时消息推送
因为项目需要,需要在网页上实现消息的推送.在百度上搜索了一下,发现实现网页上的消息推送,可以使用asp.net 中的SignalR类库,当然也可以使用H5的WebSocket Ajax的轮回.当然此 ...
- SignalR SelfHost实时消息,集成到web中,实现服务器消息推送
先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...
- Web端即时通讯、消息推送的实现
https://blog.csdn.net/DeepLies/article/details/77726823
- Asp.net SignalR 实现服务端消息推送到Web端
之前的文章介绍过Asp.net SignalR, ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信. 今天我 ...
- 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)
1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...
- How Javascript works (Javascript工作原理) (九) 网页消息推送通知机制
个人总结: 1.介绍了网页消息推送通知机制 全文地址:https://github.com/Troland/how-javascript-works 这是 JavaScript 工作原理的第九章. 现 ...
- service worker 消息推送
https://developers.google.com/web/fundamentals/codelabs/push-notifications/?hl=en 首先下载源码: git clone ...
- AngularJS+ASP.NET MVC+SignalR实现消息推送
原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现 ...
- java版Web Socket,实现消息推送
# web socket是什么? WebSocket协议是基于TCP的一种新的网络协议. 它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动发送信息给客户端. ## 用途 实时 ...
随机推荐
- python数据结构之链表(一)
数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,不过这次,我不是用模拟 ...
- 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165233
Exp0 Kali安装 安装过程 1.首先我的Mac上已经安装好了VMware Fusion,所以直接下载对应的虚拟机版本的Kali即可. 2.进入Kali官网进行下载. 以下为下载链接: Kali ...
- RabbitMQ Window环境安装
转自:https://www.cnblogs.com/zzpblogs/p/8168763.html RabbitMQ环境的安装分别介绍在Window和Linux下两个环境的安装过程. Windo ...
- FMX ScrollBox 拖拽控制
Firemonkey下的ScrollBox 拖拽控制,滚动控制,拖拽,滚动条 AniCalculations 仅允许纵向拖拽,拖拽 scrlbx.AniCalculations.TouchTracki ...
- 文件的基本操作(python)
文件打开: 1. f = open('yesterday,‘r+’,encoding = ‘utf-8’) 读取的方式加载为Utf-8 r 打开文件并写, 只适用于文字类 r+ 打开文件并读 ...
- Spring MVC 确定目标方法POJO 类型参数
1:确定一个Key 2. 在implicitMode 中存在Key 对应的对象, 若存在则作为参数传入 3. 在implicitMode 中不存在Key 对应的对象, 则检查当前@SessionAtr ...
- Spring boot Tomcat配置
来自: https://www.cnblogs.com/a8457013/p/7687764.html
- 4 python内置函数
1.内置函数的整体介绍 内置参数官方详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii 2.各内置函数介 ...
- CStatic控件SS_NOTIFY属性
SS_NOTIFY Sends the parent window STN_CLICKED, STN_DBLCLK, STN_DISABLE, and STN_ENABLE notification ...
- eclipse 自动生成json格式的toString()方法
文本代码 {"${member.name()}":"${member.value}", "${otherMembers}"}