所有浏览器在开始呈现您已通过网络刷新的部分http响应之前等待某些内容(有时也会等待一些时间) - 但是多少?
我有一个相对简单的 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) 我测试HttpResponse#flushBuffer及PrintWriter#flush上Tomcat 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 …
我有一个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是可能的.
那么,我正在寻找可能的解决方案:
我认为另一种选择是抛弃WCF,支持更友好的REST(我开始认为WCF不是正确的选择).但是,现在在WCF中写了这么多,这似乎是一项繁琐的工作.除非有一些我可以切换到的东西,这将是一个简单的迁移(例如,如果我可以重用相同的服务类,可能只有不同的属性).南希也许?
我们有一个网站,可通过http流文本数据。它是通过以下方式设置的:
Content-Type 是 text/plainTransfer-Encoding 是 chunked当使用纯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两者中点击它,即可观察到不同的行为。