.消息类,可直接通过这个类推送消息 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. servlet练习1

    1. 编写一个Servlet,当用户请求该Servlet时,显示用户于几点几分从哪个IP(Internet Protocol)地址连线至服务器,以及发出的查询字符串(Query String).查询一 ...

  2. cmd查看电脑是32位还是64位

    代码如下 @echo off if "%PROCESSOR_ARCHITECTURE%" == "AMD64" (   echo OS is 64bit) EL ...

  3. 基于OpenGL编写一个简易的2D渲染框架-13 使用例子

    这是重构渲染器的最后一部分了,将会给出一个 demo,测试模板测试.裁剪测试.半透明排序等等: 上图是本次 demo 的效果图,中间的绿色图形展现的是模板测试. 模板测试 void init(Pass ...

  4. NDK开发中的一个HTTP下载实例附带下载进度

    有一个控制下载的管理类吧,调用http下载类进行各种下载,同时在下载过程中可以显示其下载的进度,而且在每个下载结束之后以类似回调的方式告诉管理类,以继续进行后续的操作. 直接代码: .h文件 #pra ...

  5. 在Eclipes中查看源代码和大纲快速定位

    1 在Eclipes中查看源代码,快捷键使用clrl+光标,选择你要查看的方法和属性查看源代码.例如你想看StringBuilder这个类源代码 StringBuilder allow = new S ...

  6. java public project default private

  7. pyplot文本显示

    pyplot文本显示 pyplot中文字符显示 pyplot默认不支持中文字符,因为默认字体是sans-serif,英文字体不能显示中文 方法1,修改需要输出中文字符的地方 在有中文输出的地方,添加属 ...

  8. linux kernel 的配置及编译

    1. 执行make menuconfig 配置内核 2. 执行make zImage 编译内核 3. 执行make modules 编译模块 4. 内核源代码的配置及编译系统 Makefile Kco ...

  9. makefile 中的赋值

    1. 在makefile 中可以使用后面定义的变量,未定义的变量值为空 = 使用变量时执行赋值操作 := 立即执行赋值操作 ?= 如果没有赋值过,就赋予后面的值 += 将后面的值追加到原来的值后面 参 ...

  10. minikube

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://p ...