如何用ASP.NET实现bosh模拟http双向长连接请求
在做研究之前先简单说一下之前公司的通讯模块。最早的时候公司开发的web管理系统是需要配合c++桌面客户端进行一些系统底层操作,并非普通的b/s架构,或者c/s架构,因为需求是可以通过web管理系统向客户端发送一些简单的指令和策略,客户端根据不同只指令或策略进行系统底层的一些操作,并可以向服务器提交日志及状态信息.
依此我们设计了如下架构:

其中web服务器是用c#写的,通讯服务器是用c++写的,客户端使用c++写的,管理员通过web登录到web服务器管理界面,将相关策略发送到通讯服务器,再由通讯服务器通知到c++客户端,为了保证能够即时得到通知,使用通讯服务器与客户端之间建立tcp连接是必须的。但是由此导致了一个问题,就是通讯服务器中可能包含了和web服务器相同的业务代码,导致维护比较麻烦,并且在c++通讯服务器中修改业务代码,没有web服务器中的asp.net那么方便.
后来我们修改了这种设计方式,通讯服务器只是用来做和客户端之间的长连接维持,只接收转发web管理服务器下发的指令,当c++客户端需要获取数据,或者提交业务数据的时候,直接连接到web服务器post相关请求获取或者提交数据.这样客户端的连接通道分成了指令通道(TCP)和数据通道(HTTP).这样的好处是通讯服务器不用再处理业务了,所有的业务处理都通过数据通道交由web管理服务器处理.通讯服务器不需要再发生改变.
再就是后来我们想到是不是通讯服务器也可以去掉,这样可以节省掉c++模块的维护,只使用web服务器进行通讯,并且也方便以后的调试.但是使用http协议进行通讯有个最大的缺陷就是只能客户端通过web服务器去拉取数据,而web服务器无法向客户端主动下发数据.为了克服这个缺点,研究了使用http协议轮询数据,或者建立http长连接,但在时效性,性能,兼容性各方面考虑最后还是没有使用.后来研究xmpp的时候,发现webIM的很多实现用了一种叫Bidirectional-streams Over Synchronous HTTP (BOSH)的技术,可以模拟双向通讯.于是下面我就是实验了一下.
根据bosh的说法就是客户端向服务器发起请求之后,服务器如果当前没有数据的话,就hold住这个请求,不立即返回,当有数据的时候,再返回此次请求.怎样hold住就是问题的关键了,由于之前没用过asp.net但可以预见到,直接把请求的当前线程挂起是不行的,如果1000个请求就挂住一千个线程,服务器是受不了的,猜测asp.net应该有一种异步处理机制的,网上搜了一下,果然米有问题,添加"一般处理程序"修改为继承异步接口就可以了,如下代码.
public class _long : IHttpAsyncHandler
{
public bool IsReusable
{
get
{
return false;
}
}
public System.IAsyncResult BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData)
{
LongAsyncResult result = new LongAsyncResult(cb, context);
try
{
//do something
}
catch (System.Exception ex)
{
result.SetSyncComplete();
}
return result;
}
public void EndProcessRequest(System.IAsyncResult result)
{
//do something
}
public void ProcessRequest(System.Web.HttpContext context)
{
//throw new Exception("The method or operation is not implemented.");
}
}
后来我们公司根据实际情况还是用http建立了两个通道,一般业务请求处理,使用普通的http短连接请求,而服务器的数据下发则使用的bosh建立的双向通道.经过测试修改iis部分配置之后,连接数是没有限制的,关键就是看业务执行的效率了.如果对性能没有什么特殊的要求的话,这种实现方式的开发效率还是很高的.
总结一下使用这种方式的好处:
可以利用IIS稳定高效的底层通讯框架。
可以使用.NET框架迅速开发出稳定程序,并可以方便对业务的快速修改。
可以跨平台部署通讯服务器。
可以利用IIS或者Apache现成的负载均衡解决方案。
在外网部署,http协议防火墙穿透性比较强。
可以利用一些现成的http代理服务器进行通讯跳转。
如何用ASP.NET实现bosh模拟http双向长连接请求的更多相关文章
- 基于ASP.NET的comet简单实现 http长连接,IAsyncResult
http://www.cnblogs.com/hanxianlong/archive/2010/04/27/1722018.html 我潜水很多年,今天忽然出现.很久没写过博客了,不是因为不想写,而是 ...
- 转:基于ASP.NET的Comet长连接技术解析
原文来自于: Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的 ...
- Asp.Net实现Http长连接推送
话说最新帮一个朋友搞智能家居方面的东西,做一个云平台.主要作用手机在局域网外环境时对手机客户端和智能网关中命令的互相转发. 目前已经有了一个稳定的Socket版本,但是考虑到以后的扩展和性能指标要改成 ...
- 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图
如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?
- ASP.NET WebForm路由模拟
一.ASP.NET MVC 路由(一)--- ASP.NET WebForm路由模拟 2014-11-08 11:49 by 郝喜路, 232 阅读, 0 评论, 收藏, 编辑 ASP.NET Web ...
- 使用 C# 编写简易 ASP.NET Web 服务器 ---- 模拟IIS的处理过程
如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/07/16/use-csharp-write-asp ...
- 请教如何用ASP.NET实现http://abc.com/orderID这样的URL???
我查看了一下微信二维码的内容是:https://u.wechat.com/XXXXXXXXX这种格式. 我现在想把我们的订单URL也做成 http://abc.com/orderID这样子,做成二维码 ...
- ASP.NET MVC 5 学习教程:创建连接字符串
原文 ASP.NET MVC 5 学习教程:创建连接字符串 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...
- 在ASP.NET 5应用程序中的跨域请求功能详解
在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...
随机推荐
- dom4j生成、解析xml
/** * 创建xml * @param obj 泛型对象 * @param entityPropertys 泛型对象的List集合 * @param Encode XML自定义编码类型 * @par ...
- 关于SPA及RPA
SPA Request-------->Callback (page onload,execute <script>)-------->call func RPA URL re ...
- iOS开发——UI篇Swift篇&玩转UItableView(一)基本使用
UItableView基本使用 class ListViewController: UIViewController , UITableViewDataSource, UITableViewDeleg ...
- oracle 有用站点
使用oradebug修改数据库scn – 提供专业ORACLE技术咨询和支持@Phone13429648788 - 惜分飞 Solaris上使用DTrace进行动态跟踪 老熊的三分地-Oracle及数 ...
- 虚拟文件系统VFS
Linux的文件系统是由虚拟文件系统作为媒介搭建起来的,虚拟文件系统VFS(Virtual File System)是Linux内核层实现的一种架构,为用户空间提供统一的文件操作接口.它在内核内部为不 ...
- NULL、NUL、‘\0’、0以及EOF
0 is an integer constant, '\0' is a character constant, nul is the name of the character constant. N ...
- android学习日记14--网络通信
一.Android网络通信 android网络通信一般有三种:java.net.*(标准Java接口).org.apache接口(基于http协议)和android.net.*(Android网络接口 ...
- 记录一下bing的图片 - 升级版冰糖葫芦
记录一下bing的图片 - 升级版冰糖葫芦
- Windows 之 删除保存的共享凭据(用户名和密码)
当我们在访问Windows共享文件夹或者NAS网络共享盘的时候,Windows会提示输入访问共享所需要的用户名和密码,如果我们勾选了“记住我的凭据”,Windows 就会将认证凭据保存到计算机中,以方 ...
- 每天一道面试题(2):实现strncpy
目录 0. 为何要写strncpy? 1. 源码及测试结果 2. 面试注意事项 3. 小结