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

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

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

        本文主要描述如何在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
分享给朋友:

相关文章

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

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

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

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

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

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

ASP.NET中报“无法在已发送HTTP标头之后设置状态”异常问题解决

ASP.NET中报“无法在已发送HTTP标头之后设置状态”异常问题解决

        ASP.NET中报“无法在已发送HTTP标头之后设置状态”异常,是因为设置Response的StatusCode之前,程序已设置响应标头。可从以...

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

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

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

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

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

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

ASP.NET Core网站报“An assembly specified in the application dependencies manifest was not found”异常解决

ASP.NET Core网站报“An assembly specified in the application dependencies manifest was not found”异常解决

        ASP.NET Core网站报“An assembly specified in the application dependencies ma...

发表评论

访客

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