【问题标题】:Keeping a HttpHandler alive / flushing intermediate data保持 HttpHandler 活动/刷新中间数据
【发布时间】:2011-12-07 19:53:42
【问题描述】:

背景:我们的一台 GPRS 设备通过代理连接到通用处理程序时遇到问题。虽然处理程序在返回后立即关闭连接,但代理保持连接打开,这是设备不期望的。

我的问题:为了测试目的(为了模仿代理的行为),是否有可能在处理程序返回其数据后让连接保持活动状态一段时间? p>

例如,这不起作用

public class Ping : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.BufferOutput = false;

        context.Response.ContentType = "text/plain";
        context.Response.WriteLine("HELLO");
        context.Response.Flush();  // <-- this doesn't send the data

        System.Threading.Thread.Sleep(10000);
    }

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

[编辑]

好的,实际上,它按预期工作。问题是 Firefox 和 Fiddler 都会延迟显示原始数据,直到连接关闭。

如果Response.BufferOutput设置为false,我使用终端程序连接,我立即获取数据,并且连接保持打开10s。

【问题讨论】:

    标签: c# asp.net http keep-alive generic-handler


    【解决方案1】:

    您可以写入输出流,这将满足您的要求。

    byte [] buffer = new byte[1<<16] // 64kb
    int bytesRead = 0;
    using(var file = File.Open(path))
    {
       while((bytesRead = file.Read(buffer, 0, buffer.Length)) != 0)
       {
            Response.OutputStream.Write(buffer, 0, bytesRead);
             // can sleep here or whatever
       }
    }
    Response.Flush();
    Response.Close();
    Response.End();
    

    查看Best way to stream files in ASP.NET

    【讨论】:

    • 谢谢。事实证明,我实际上并不需要这样做,但你的建议仍然有效。看来,一个简单的冲洗毕竟按预期工作。
    【解决方案2】:

    实际上,这毕竟很好用:

    public class Ping : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.BufferOutput = false;
    
            context.Response.ContentType = "text/plain";
            context.Response.WriteLine("HELLO"); // <-- data is sent immediately
    
            System.Threading.Thread.Sleep(10000);
        }
    }
    

    我不得不使用终端程序进行连接,但后来证明没问题。

    需要提到的一点是,ASP 在这种情况下添加了一个Transfer-Encoding: chunked 标头,它改变了数据发送的方式:

    每个块的大小在块本身之前发送,以便 客户端可以知道它何时完成接收该块的数据。 数据传输由长度为零的最终块终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2011-07-31
      • 2018-11-19
      • 2015-04-23
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多