当前位置:首页 > 技术积累 > 正文内容

ASP.NET实现HTTP长轮询(二)——一般处理程序ashx

竹林之风5年前 (2019-06-10)技术积累2706

        本文主要描述如何在ASP.NET一般处理程序中实现长轮询:

(1)实现IAsyncResult:

using System;
using System.Threading;
using System.Web;

public class LongPollingAsyncResult : IAsyncResult
{
    public HttpContext Context;
    public AsyncCallback CallBack;
    private object _AsyncState;
    private bool _CompletedSynchronously;
    private bool _IsCompleted;

    public LongPollingAsyncResult(HttpContext context, AsyncCallback cb, object extraData)
    {
        this.Context = context;
        this.CallBack = cb;
        this._AsyncState = extraData;
        this._CompletedSynchronously = false;
        this._IsCompleted = false;
    }

    public void StartAsyncWork()
    {
        int nowTimes = 0;//当前循环次数(或使用Stopwatch计算时间,超时即退出)
        int maxTimes = 60;//最大循环次数(或使用Stopwatch计算时间,超时即退出)

        //计时器,每1秒种触发一次Elapsed事件
        Timer timer = new Timer(1000);
        //订阅计时器的Elapsed事件    
        timer.Elapsed += (sender, e) =>
        {
            //判断是否已有新数据或超时,若是则停止计时器并执行如下代码
            /*this._CompletedSynchronously = false;
            this._IsCompleted = true;
            this.CallBack(this);*/ 
        };
        //启动计时器       
        timer.Start();    
    }

    // 摘要:
    //     获取用户定义的对象,它限定或包含关于异步操作的信息。
    //
    // 返回结果:
    //     用户定义的对象,它限定或包含关于异步操作的信息。
    public object AsyncState { get { return _AsyncState; } }
    //
    // 摘要:
    //     获取用于等待异步操作完成的 System.Threading.WaitHandle。
    //
    // 返回结果:
    //     用于等待异步操作完成的 System.Threading.WaitHandle。
    public WaitHandle AsyncWaitHandle { get { return null; } }
    //
    // 摘要:
    //     获取一个值,该值指示异步操作是否同步完成。
    //
    // 返回结果:
    //     如果异步操作同步完成,则为 true;否则为 false。
    public bool CompletedSynchronously { get { return _CompletedSynchronously; } }
    //
    // 摘要:
    //     获取一个值,该值指示异步操作是否已完成。
    //
    // 返回结果:
    //     如果操作完成则为 true,否则为 false。
    public bool IsCompleted { get { return _IsCompleted; } }
}

(2)ashx继承IHttpAsyncHandler:

using System;
using System.Web;

public class LongPolling : IHttpAsyncHandler
{
    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
    {
        LongPollingAsyncResult result = new LongPollingAsyncResult(context, cb, extraData);
        result.StartAsyncWork();
        return result;
    }

    public void EndProcessRequest(IAsyncResult result)
    {
        LongPollingAsyncResult asyncResult = result as LongPollingAsyncResult;

        //操作asyncResult.Context.Response输出响应
    }

    public void ProcessRequest(HttpContext context)
    {

    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

(3)使用jQuery发送请求:

(function getData() {
    $.post('LongPolling.ashx', {}, function(data) {
        //接收并处理数据
        getData();
    });
})();

扫描二维码推送至手机访问。

版权声明:本文由久爱编程网发布,如需转载请注明出处。

本文链接:https://www.9icode.com/index.php/post/21.html

标签: C#ASP.NET
分享给朋友:

相关文章

通用基础表逻辑设计(一)——配置、枚举和类别

通用基础表逻辑设计(一)——配置、枚举和类别

一、配置表        一个系统中往往有很多需要可自定义的参数,比如网站名称、联系地址等基础参数以及各种系统运行参数等等,这个时候就需要单独一个参数配置表来保...

云平台多租户系统的设计方案

云平台多租户系统的设计方案

        多租户(Multi Tenancy)是指在一个云平台上,多个不同的客户共用相同的平台和架构但又相互独立并对各自的用户提供服务。多租户相同有4个特...

IIS中使用PHP-CGI报500错误问题可能原因

IIS中使用PHP-CGI报500错误问题可能原因

        在IIS中使用CGI方式运行PHP网站突然报500服务器错误,需要判断当前系统的软件环境有何变化去一一排查,通常可能的原因有:(1)PHP程序因...

ASP.NET中报“无法在已发送HTTP标头之后进行重定向”异常问题解决

ASP.NET中报“无法在已发送HTTP标头之后进行重定向”异常问题解决

        ASP.NET中报“无法在已发送HTTP标头之后进行重定向”异常时,其中一个原因是:在已经重定向后又重定向。在ASP.NET中实现重定向有以下几...

ASP.NET网站自定义错误处理及其它安全相关

ASP.NET网站自定义错误处理及其它安全相关

        ASP.NET网站在运行过程中总是有可能报错,例如404等HTTP错误、500等程序异常。在IIS托管并报错的情况下,网站的默认行为依次是:(1).NET运行时接收并处理的部分显示.N...

从被扫描记录看网站安全应该注意的一些细节

从被扫描记录看网站安全应该注意的一些细节

1、尽可能地隐藏服务器真实IP,减少攻击目标。例如使用负载均衡、网关等作为门户,由负载均衡或网关转发到后端服务器。2、服务器必须开放的服务(除HTTP、HTTPS等为公众开放的服务外),尽可能改为其它较大的不常用的端口号,这样攻击者需要扫描...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。