保持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
你可以写入输出流,这将做你想做的。
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的最终块结束。