保持HttpHandler活动/刷新中间数据

本文关键字:中间 数据 刷新 HttpHandler 活动 保持 | 更新日期: 2023-09-27 18:16:56

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

我的问题:是可能的,为了测试的目的(为了模仿代理的行为),保持连接存活一段短时间后,处理程序已经返回了它的数据?

例如,不能工作:

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

保持HttpHandler活动/刷新中间数据

你可以写入输出流,这将做你想做的。

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();

查看在ASP中流式传输文件的最佳方法。净

实际上,这毕竟工作得很好:

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标头,它改变了数据发送的方式:

每个块的大小在块本身之前发送,因此a客户端可以告诉它什么时候完成了该块的数据接收。数据传输以长度为0的最终块结束。