相关疑难解决方法(0)

使用"transfer-encoding:chunked",在浏览器开始渲染之前必须发送多少数据?

所有浏览器在开始呈现您已通过网络刷新的部分http响应之前等待某些内容(有时也会等待一些时间) - 但是多少?

browser http chunked-encoding

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

FastAPI StreamingResponse 不使用生成器函数进行流式传输

我有一个相对简单的 FastAPI 应用程序,它接受查询并从 ChatGPT 的 API 流回响应。ChatGPT 正在流回结果,我可以看到它在输入时被打印到控制台。

不工作的是StreamingResponse通过 FastAPI 返回。相反,响应会一起发送。我真的不知道为什么这不起作用。

这是 FastAPI 应用程序代码:

import os
import time

import openai

import fastapi
from fastapi import Depends, HTTPException, status, Request
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from fastapi.responses import StreamingResponse

auth_scheme = HTTPBearer()
app = fastapi.FastAPI()

openai.api_key = os.environ["OPENAI_API_KEY"]


def ask_statesman(query: str):
    #prompt = router(query)
    
    completion_reason = None
    response = ""
    while not completion_reason or completion_reason == "length":
        openai_stream = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "user", "content": query}],
            temperature=0.0,
            stream=True,
        )
        for …
Run Code Online (Sandbox Code Playgroud)

python streaming python-requests fastapi openai-api

14
推荐指数
1
解决办法
3万
查看次数

Tomcat不会刷新响应缓冲区

我测试HttpResponse#flushBufferPrintWriter#flushTomcat 7下方,但它似乎是回应,而忽略了他们比尽快冲洗过线的内容符合市场预期.

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        PrintWriter pw = response.getWriter();
        pw.println("say hi now");
        pw.flush();
        response.flushBuffer();
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
        }
        pw.println("say bye in 5 seconds");

    }

}
Run Code Online (Sandbox Code Playgroud)

在延迟之后,浏览器一起显示"hi"和"bye".这是不正当行为还是打算?

@编辑

根据@Tomasz Nurkiewicz我的建议,我再次测试,curl然后问题就消失了.似乎标准的浏览器和tcp/ip …

java tomcat servlets tomcat7

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

如何在不缓冲的情况下从WCF流式传输响应?

我有一个restful(webHttpBinding)自托管WCF服务.大多数方法都将xml或json版本的对象返回给客户端.

我有几个GET方法触发长时间运行的方法,我想将日志响应流式传输到浏览器(或应用程序),以便用户知道发生了什么.这很容易实现HttpContext.Current.Response.OutputStream.Write.不幸的是,HttpContext.Current在自托管WCF服务中始终为null,即使我包含aspNetCompatibilityEnabled配置(遗憾的是IIS不是一个选项).

我试过AnonymousPipeServerStream: WCF和流请求和响应

以及第一个设置:

OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse;
context.ContentType = "text/plain";
Run Code Online (Sandbox Code Playgroud)

这样响应进入浏览器就不会将流下载到文件中进行保存.

在Chrome中它根本不起作用 - 它会缓冲到最后.在IE或wget中,它似乎一次缓冲大约4k(或其他东西).这对于日志记录没有好处,除非我吐出大量不必要的日志消息来强制输出,用户并不真正知道发生了什么.我只能假设这是因为响应实际上是一个分块响应而且块是4k(而不是仅仅写入输出流).

将chrome输出到输出的修复显然是在发送分块响应之前给内容写了一些垃圾:Chunked transfer encoding - 浏览器行为,但是,我不认为这对于WCF是可能的.

那么,我正在寻找可能的解决方案:

  • 一种在自托管服务(无IIS)中写入WCF中的输出流的方法.要么
  • 一种控制流响应中的块大小的方法(以及首先编写一些内容以便Chrome将呈现块的方式).

我认为另一种选择是抛弃WCF,支持更友好的REST(我开始认为WCF不是正确的选择).但是,现在在WCF中写了这么多,这似乎是一项繁琐的工作.除非有一些我可以切换到的东西,这将是一个简单的迁移(例如,如果我可以重用相同的服务类,可能只有不同的属性).南希也许?

.net c# rest wcf stream

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

流文本数据时禁用Chrome缓冲

我们有一个网站,可通过http流文本数据。它是通过以下方式设置的:

  • 它不做任何服务器端缓冲
  • Content-Typetext/plain
  • Transfer-Encodingchunked
  • 压缩被禁用

当使用纯curl文本或FireFox时,文本从第一个字节流到浏览器。但是,使用Chrome浏览器时,在发送1024个字节之前不会显示任何文本。之后,一切都会立即显示出来。

问题:有没有办法禁用这种缓冲行为?

更多信息:这是一个简单的ASP.NET页面,演示了该行为:

<%@ language=c# %>

<%
    Response.BufferOutput = false;
    Response.ContentType = "text/plain";

    for (int i=0; i<50; i++)
    {
        Response.Write("01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567\r\n");
        System.Threading.Thread.Sleep(1000);
    }
%>
Run Code Online (Sandbox Code Playgroud)

使用禁用压缩的web.config:

<configuration>
    <system.webServer>
        <urlCompression doStaticCompression="false" doDynamicCompression="false"/>
    </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我还在http://bufferingtest.azurewebsites.net/上运行了一个实时repro 。只需从Chrome和FireFox两者中点击它,即可观察到不同的行为。

streaming google-chrome http

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