所有浏览器在开始呈现您已通过网络刷新的部分http响应之前等待某些内容(有时也会等待一些时间) - 但是多少?
我可以简单地设置Transfer-Encoding标题吗?
Response.Flush()在某些时候打电话会导致这种情况发生吗?
编辑
不,我不能打电话给Response.Headers.Add("Transfer-Encoding","anything"); 那个投掷.
还有其他建议吗?
我正在寻求使用该IRequiresRequestStream接口来启用使用ServiceStack(v3)和分块传输编码的大文件上传(视频文件).标准文件上传似乎无法应对客户上传的一些较大的视频文件,因此我们希望为这些文件启用分块传输编码.
我已成功测试了分块传输编码文件上传,但还有许多参数需要与文件一起发送.
由于IRequiresRequestStream绕过了ServiceStack请求对象解析器,Stream因此显然没有填充请求对象中的任何其他参数.作为一种解决方法,我可以看到以下选项:
this.Request.QueryString集合访问this.Request.Headers集合访问RequestBinder?我已经设法实现了选项1和2,但不知何故感觉还不够RESTful.我更喜欢使用Path -> RequestDTO,但我正在努力RequestBinder.
服务:
public object Any(AttachmentStreamRequest request)
{
byte[] fileBytes = null;
using (var stream = new MemoryStream())
{
request.RequestStream.WriteTo(stream);
length = stream.Length;
fileBytes = stream.ToArray();
}
string filePath = @"D:\temp\test.dat";
File.WriteAllBytes(filePath, fileBytes);
var hash = CalculateMd5(filePath);
var requestHash = this.Request.QueryString["Hash"];
var customerId = this.Request.QueryString["CustomerId"];
var fileName = this.Request.QueryString["FileName"];
// nicer would be
// var requestHash = …Run Code Online (Sandbox Code Playgroud) 我有一个建立在Spring MVC之上的应用程序.
我想编写处理请求的简单代理,如下所示:
这是我到目前为止所得到的:
public void proxyRequest(HttpServletRequest request, HttpServletResponse response) {
try {
HttpUriRequest proxiedRequest = createHttpUriRequest(request);
HttpResponse proxiedResponse = httpClient.execute(proxiedRequest);
writeToResponse(proxiedResponse, response);
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void writeToResponse(HttpResponse proxiedResponse, HttpServletResponse response){
for(Header header : proxiedResponse.getAllHeaders()){
response.addHeader(header.getName(), header.getValue());
}
OutputStream os = null;
InputStream is = null;
try {
is = proxiedResponse.getEntity().getContent();
os = response.getOutputStream();
IOUtils.copy(is, os);
} catch (IOException …Run Code Online (Sandbox Code Playgroud) 我似乎无法得到以下问题的明确答案(谷歌搜索和阅读HTTP/1.1规范):
当使用'chunked'传输编码时,为什么服务器需要以字节为单位写出块大小并使后续块数据以CRLF结束.这不会使发送二进制数据"CRLF-unclean"并且方法有点多余吗?如果数据在某处有一个0x0A后跟0x0D(即这些实际上是数据的一部分)怎么办?客户端是否应该遵守在数据中遇到的第一个CRLF上的块头或阻塞处明确提供的块大小?到目前为止,我的理解是简单地获取服务器提供的块大小,继续下一行,然后从以下数据中读取这个字节数(CRLF或内部没有CRLF),然后跳过跟随数据的CRLF并重复该过程,直到没有更多的块... 我对吗?那么每个数据库之后的CRLF有什么意义呢?可读性?
我有一个在Tomcat 6.0.29服务器和JDK 1.6上运行的Web应用程序.
当我将响应发送到客户端时,Tomcat发送
Transfer-Encoding: chunked
Run Code Online (Sandbox Code Playgroud)
响应大小> 8KB时在标头中.对于<8KB的回复,它会发送
Content-Length :
Run Code Online (Sandbox Code Playgroud)
我知道Chunked编码是处理批量响应的首选方式,但是我们的客户不希望更改其代码(因为它分布在整个服务器上).
如何在Tomcat中禁用Chunked编码?
我可以在Tomcat中禁用HTTP/1.1并启用HTTP/1.0(不知道我该怎么做)
我尝试了以下但没有成功:
在Connector标签中server.xml,我设置了bufferSize =" 65536"
Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
bufferSize="65536" socketBuffer="65536"
redirectPort="8443" />
Run Code Online (Sandbox Code Playgroud)在server.xml中使用NIOConnector并进行以下配置:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
socket.directBuffer="false"
socket.rxBufSize="25188"
socket.txBufSize="43800"
socket.appReadBufSize="32768"
socket.appWriteBufSize="32768"
socket.bufferPool="500"
socket.bufferPoolSize="100000000"
socket.processorCache="500"
socket.keyCache="500"
socket.eventCache="500"
socket.tcpNoDelay="false"
socket.soKeepAlive="true"
socket.soTimeout="5000"
redirectPort="8443" />
Run Code Online (Sandbox Code Playgroud)我有这个任务,我正在从一个设备读取数据并通过Web服务提供它.数据每秒读取4次.我希望Web客户端具有开放的HTTP连接,并且只要客户端保持连接打开,就可以使用分块传输将设备读数作为流获取.
作为一个概念证明,我想从一个不断生成随机数的服务开始,每秒4次,将其包装在json中并将其传输给客户端.我试图基于twitter流API来松散地建模.
我正在使用restlet 2.1.2创建该Web服务,但我不确定我应该使用哪个Representation来实现这一点.我试着搜索这个,但没有找到任何有用的东西.有人可能会指出我正确的方向,我应该使用什么,也许是一些例子.
谢谢
我正在使用请求从服务器下载文件(几千兆字节).要提供进度更新(并防止整个文件必须存储在内存中),我已将stream=True下载设置并写入文件:
with open('output', 'w') as f:
response = requests.get(url, stream=True)
if not response.ok:
print 'There was an error'
exit()
for block in response.iter_content(1024 * 100):
f.write(block)
completed_bytes += len(block)
write_progress(completed_bytes, total_bytes)
Run Code Online (Sandbox Code Playgroud)
但是,在下载中的某个随机点,请求会抛出一个ChunkedEncodingError.我已经进入源代码,发现这对应于IncompleteRead异常.我在这些行周围插入了一条日志语句并发现了e.partial = "\r".我知道服务器给下载的优先级低,我怀疑当服务器等待太长时间发送下一个块时会发生这种异常.
正如预期的那样,例外会停止下载.不幸的是,服务器没有实现HTTP/1.1的内容范围,所以我不能简单地恢复它.我已经玩过增加urllib3的内部超时,但异常仍然存在.
反正有没有让底层urllib3(或请求)更容忍这些空(或晚)块,以便文件可以完全下载?
我有一个相当标准的MEAN项目设置,使用了yeoman的angular-fullstack生成器.
我发现的是,当获取一个较大的(超过65536字节)json结果时,它使用gzip和chunked进行编码,但返回的json无法在chrome中查看或由我的angular client $ resource使用,因为它包含TWO答复!例如,{name:'hi'}{name:'hi'}对于单个id或[{..},{..}][{..},{..}]阵列.
服务器api端点是从angular-fullstack生成器自动生成的,看起来像:
// Get list of worlds
exports.index = function(req, res) {
World.find(function (err, worlds) {
if(err) { return handleError(res, err); }
res.json(200, worlds);
});
};
Run Code Online (Sandbox Code Playgroud)
如果我对数据进行切片以使其不被分块,那么json就会很好地形成.我已经检查了mongo db并且数据也正常并且调试worlds变量,我可以JSON.stringify并获得预期的字符串结果而没有任何重复.但是当它被发送的那一刻,我正在将响应的json结果加倍.
更新评论
angular-fullstack 2.0.4
架构看起来像:
'use strict';
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var WorldSchema = new Schema({
name: String,
info: String,
active: Boolean,
tiles: [Schema.Types.Mixed]
});
module.exports = mongoose.model('World', WorldSchema);
Run Code Online (Sandbox Code Playgroud)
种子:
var newWorld = new WorldModel({
_id: planet._objectId, …Run Code Online (Sandbox Code Playgroud) HTTP 1.1客户端是否可以设置一个标头值,指示不应对请求的响应进行分块?或者是防止这种情况的唯一方法是发送HTTP 1.0请求?我试过谷歌搜索,但我能找到的方法是禁用HTTP 1.1服务器上的分块传输,所以我猜测它在客户端是不可能的,但我想我还是会问.
chunked-encoding ×10
http ×4
.net ×1
angularjs ×1
asp.net ×1
browser ×1
c# ×1
chunked ×1
exception ×1
http-1.1 ×1
http-chunked ×1
http-headers ×1
http-proxy ×1
httpresponse ×1
java ×1
javascript ×1
json ×1
node.js ×1
python ×1
restlet ×1
restlet-2.0 ×1
servicestack ×1
spring-mvc ×1
tomcat6 ×1