相关疑难解决方法(0)

分块传输编码 - 浏览器行为

我正在尝试以分块模式发送数据.正确设置所有标头并相应地编码数据.浏览器将我的响应识别为分块,接受标头并开始接收数据.

我期待浏览器会在每个收到的块上更新页面,而是等待直到收到所有块然后全部显示它们.这是预期的行为吗?

我希望看到每个块在收到后立即显示.使用时curl,每个块在收到后立即显示.为什么GUI浏览器不会发生同样的情况?他们使用某种缓冲/缓存吗?

我将Cache-Control标头设置为no-cache,所以不确定它是否与缓存有关.

browser firefox google-chrome http

23
推荐指数
2
解决办法
7552
查看次数

通过HTTP传输纯文本

我希望通过HTTP流式传输一组日志消息.我想一次发送一行消息,可能在行之间有延迟,我希望在服务器发送后尽快在浏览器中显示每一行.

我目前的方法是设置Content-Typetext/plain; charset=UTF-8响应,并从服务器开始必要时启动它们之间的延迟流线.我确保在每次写入后刷新所有相关的输出流.

我在Chrome中观察到的行为是它等待响应完全完成后再显示任何内容.但我想要的行为是看到发送的每一行.这可能吗?

我已经提出了很多关于这个主题的stackoverflow问题,但没有一个问题已经回答了我的问题.我认为Transfer-Encoding这与我无关,因为这似乎是为了下载大文件(如果我错了,请纠正我).

不是关于下载文件的问题,因为我希望直接在浏览器中呈现这些行.

http stream http-headers

8
推荐指数
1
解决办法
1987
查看次数

如何在NancyFX中编写流输出?

我正在使用Nancy编写一个简单的Web应用程序.至少有一个请求导致未知长度的流,所以我无法提供Content-Length.我想使用Transfer-Encoding: chunked,或(在这种情况下同样可以接受Connection: close).

我已经对Nancy源代码进行了快速破解,并且我已添加Response.BufferOutput,并且代码设置HttpContext.Response.BufferOutputfalse.你可以在这里看到:

public class HomeModule : NancyModule
{
    public HomeModule()
    {
        Get["/slow"] = _ => new SlowStreamResponse();
    }

    private class SlowStreamResponse : Response
    {
        public SlowStreamResponse()
        {
            ContentType = "text/plain";
            BufferOutput = false;
            Contents = s => {
                byte[] bytes = Encoding.UTF8.GetBytes("Hello World\n");
                for (int i = 0; i < 10; ++i)
                {
                    s.Write(bytes, 0, bytes.Length);
                    Thread.Sleep(500);
                }
            };
        }
    }
Run Code Online (Sandbox Code Playgroud)

它似乎没有任何影响.5秒钟后响应立即响起.我已经测试了这个基于简单WebRequest的客户端.

如何在Nancy中使用chunked输出?我正在使用ASP.NET托管,但我对其他托管选项的答案感兴趣.

如果我写一个简单的服务器使用 …

nancy

7
推荐指数
2
解决办法
6022
查看次数

node.js 表达 response.write() 在 Safari 中不是异步的

我有一个非常简单的node.js服务器,我用它来 ping 一些我需要保持在线的服务器。

使用Express,我可以访问一个非常简单的端点,它将执行请求循环并报告结果。

在每个循环上使用res.write(),我加载的网页可以向我显示正在发生的进度。

问题是,这种进展不会发生在SafariOS XiOS。它会等到该过程完成,然后一次性转储整个输出。

这是我的代码的示例:

router.route('/test').get(function(req, res)
{
    res.write('<html><head></head><body>');
    res.write('Starting tests...<br />');
    performServerTests(req, res, function(results)
    { // Each loop within performServerTests also uses res.write()
        res.write('<br />Complete');
        res.end('</body></html>');
    });
});
Run Code Online (Sandbox Code Playgroud)

是否有已知的原因导致 Safari 会等待调用res.end()后再显示其已有的内容,而 Chrome 会res.write()在收到消息时显示每条消息?

谢谢

javascript safari node.js express

1
推荐指数
1
解决办法
1529
查看次数