0

背景:我们的一个 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,并且我使用终端程序连接,我会立即获取数据,并且连接保持打开 10 秒。

4

2 回答 2

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

查看在 ASP.NET 中流式传输文件的最佳方式

于 2011-12-07T10:46:23.493 回答
0

实际上,这毕竟工作正常:

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

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

应该提到的一件事是 ASPTransfer-Encoding: chunked在这种情况下添加了一个标头,它改变了数据的发送方式:

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

于 2011-12-07T11:40:46.487 回答