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)通信,允许服务器主动发送信息给客户端. ## 用途 实时 ...
随机推荐
- servlet练习1
1. 编写一个Servlet,当用户请求该Servlet时,显示用户于几点几分从哪个IP(Internet Protocol)地址连线至服务器,以及发出的查询字符串(Query String).查询一 ...
- cmd查看电脑是32位还是64位
代码如下 @echo off if "%PROCESSOR_ARCHITECTURE%" == "AMD64" ( echo OS is 64bit) EL ...
- 基于OpenGL编写一个简易的2D渲染框架-13 使用例子
这是重构渲染器的最后一部分了,将会给出一个 demo,测试模板测试.裁剪测试.半透明排序等等: 上图是本次 demo 的效果图,中间的绿色图形展现的是模板测试. 模板测试 void init(Pass ...
- NDK开发中的一个HTTP下载实例附带下载进度
有一个控制下载的管理类吧,调用http下载类进行各种下载,同时在下载过程中可以显示其下载的进度,而且在每个下载结束之后以类似回调的方式告诉管理类,以继续进行后续的操作. 直接代码: .h文件 #pra ...
- 在Eclipes中查看源代码和大纲快速定位
1 在Eclipes中查看源代码,快捷键使用clrl+光标,选择你要查看的方法和属性查看源代码.例如你想看StringBuilder这个类源代码 StringBuilder allow = new S ...
- java public project default private
- pyplot文本显示
pyplot文本显示 pyplot中文字符显示 pyplot默认不支持中文字符,因为默认字体是sans-serif,英文字体不能显示中文 方法1,修改需要输出中文字符的地方 在有中文输出的地方,添加属 ...
- linux kernel 的配置及编译
1. 执行make menuconfig 配置内核 2. 执行make zImage 编译内核 3. 执行make modules 编译模块 4. 内核源代码的配置及编译系统 Makefile Kco ...
- makefile 中的赋值
1. 在makefile 中可以使用后面定义的变量,未定义的变量值为空 = 使用变量时执行赋值操作 := 立即执行赋值操作 ?= 如果没有赋值过,就赋予后面的值 += 将后面的值追加到原来的值后面 参 ...
- minikube
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://p ...