是否有一种标准的方法来处理分块响应的响应失败?我已经倾注了RFC并且没有看到处理这个问题的标准方法.
我对分块响应的理解是,当我们无法在服务器上立即处理整个响应时,它们非常有用.因此,似乎有可能虽然通过处理响应的一部分方式发生致命错误并且响应需要终止.
我最初的想法是关闭连接是最好的解决方案,但我想确保没有其他方法来处理这种情况.谢谢.
我已经检查了与此相关的其他问题,但唯一的答案是"使用ASIHTTPRequest",因为这已经不再开发了我想问一下人们正在使用什么替代方案,而在我们的SDK上工作时我遇到了很多奇怪的行为NSURLConnection从服务器接收数据时.
我们追踪到的事实是,NSURLConnection它不能很好地处理分块编码中的响应.或者至少我们在这里阅读NSURLConnection和"chunked"转移编码这个问题
我们正在谈论的一些开发人员说它在iOS 5中变得更好,我们需要确保我们的SDK至少与iOS 4.3向后兼容.
我想确认这是一个问题NSURLConnection,以及人们如何处理它.
到目前为止,我发现的所有替代方案都是基于NSURLConnection并且我假设因此具有相同的缺陷.ASIHTTPRequest事实上确实有效,因为它的基础略低于NSURLConnection,但正在寻找不再支持的知识替代品.
其他的库列表看着是:
Restkit,
ShareKit,
LRResty,
AFNetworking,
TTURLRequest
我知道这里有类似的问题RESTKit是ASIHTTPRequest的一个很好的替代品吗?这里ASIHTTPRequest替代方案但这两个解决方案都基于NSURLConnection.
编辑:我注意到我在帖子的开头指出了错误的问题,所以更新了.它指向了2008年的一个主题,我看到了类似的但没有最新的.
HTTP 1.1客户端是否可以设置一个标头值,指示不应对请求的响应进行分块?或者是防止这种情况的唯一方法是发送HTTP 1.0请求?我试过谷歌搜索,但我能找到的方法是禁用HTTP 1.1服务器上的分块传输,所以我猜测它在客户端是不可能的,但我想我还是会问.
有时,在将代码部署到服务器之后,我没有真正的原因得到以下控制台消息和完全空白的屏幕:
net::ERR_INCOMPLETE_CHUNKED_ENCODING
Run Code Online (Sandbox Code Playgroud)
Apache重新启动修复它,但我不明白它为什么会发生.文件系统更改但不更改任何配置.我没有在没有进行部署时遇到它,所以关于文件系统在apache运行时发生变化似乎会导致它.
文档根目录是最新版本文件夹的符号链接(当前/).
nginx的变化0.8.35 2010年4月1日
Run Code Online (Sandbox Code Playgroud)*) Change: now the charset filter runs before the SSI filter. *) Feature: the "chunked_transfer_encoding" directive.
这很好,因为我试图通过nginx反向代理将git更改推送到git-http-backend进程.由于客户端效率原因, Git HTTP利用了分块传输编码.
但是,我无法让它发挥作用.我在Debian Lenny上使用nginx 0.8.44并进行以下配置调用:
./configure \
--sbin-path=/usr/sbin \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--user=www-data \
--group=www-data \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module
Run Code Online (Sandbox Code Playgroud)
以下conf文件:
server {
server_name example.com;
location / {
proxy_pass http://192.168.0.10;
include /etc/nginx/proxy.conf;
chunked_transfer_encoding on;
}
}
Run Code Online (Sandbox Code Playgroud)
我proxy.conf看起来像这样:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header …Run Code Online (Sandbox Code Playgroud) 目前我在显示从我的Web服务Node.js服务器(localhost:3000)发送到Node.js服务器上运行的模拟客户端(localhost:3001)的"响应块"时出现问题.
逻辑如下:
1.在"城市"的客户端创建一个数组,并将它们(从AngularJS控制器)发布到位于以下位置的Web服务:localhost:3000/getMatrix
$http({
method: 'POST',
url: 'http://localhost:3000/getMatrix',
data: cityArray
}).
success(function (data,status,headers,config){
// binding of $scope variables
// calling a local MongoDB to store the each data item received
for(var key in data){
$http.post('/saveRoutes', data[key])
.success(function (data, status){
// Data stored
})
.error(function (data, status){
// error prints in console
});
}
}).
error(function (data,status,headers,config){
alert("Something went wrong!!");
});
Run Code Online (Sandbox Code Playgroud)
2.然后,Web服务运行其过程以创建"城市"矩阵(例如,如果它通过了5个城市,它将返回5by5 [25项]的JSON矩阵).但问题是,由于Node的> response.write(数据),它以"块"传回数据.
旁注 - Node.js自动设置标题中的'Transfer-Encoding':'chunked'
* Other code before (routing/variable creation/etc.) *
res.set({
'Content-Type':'application/json; …Run Code Online (Sandbox Code Playgroud) 所以我有一个MVC项目.此MVC项目包含一个Controller,需要将内容流回客户端.当流媒体开始时,无法确定内容长度(它是在运行中计算的).所以我打开HttpContext.Current.Response.OutputStream,并开始定期写入和刷新(我已经禁用了缓冲输出,并附加了相应的http头):
while (some condition){
HttpContext.Current.Response.OutputStream.Write(buffer, 0, buffer.Length);
HttpContext.Current.Response.Flush();
}
Run Code Online (Sandbox Code Playgroud)
如果我然后强制关闭流:
HttpContext.Current.Response.Close();
Run Code Online (Sandbox Code Playgroud)
它没有正确地结束Chunked内容(它不会在末尾追加0长度的块,以向客户端指示EOF).
如果我更优雅地关闭输出流:
HttpContext.Current.Response.End();
Run Code Online (Sandbox Code Playgroud)
要么
HttpContext.Current.ApplicationInstance.CompleteRequest();
Run Code Online (Sandbox Code Playgroud)
它正确地关闭了流(附加到结尾的零长度块),但是我得到了应用程序抛出的异常,表明它无法将HTTP头插入输出流,因为流已经被写入了!
在这两种情况下,Controller都会继续返回null(或EmptyActionResult).
我假设异常是由于MVC堆栈要求每个ActionResult在Controller完成执行后设置HTTP头而引起的.如果是这种情况,如何在MVC中实现Chunked流?
提前致谢!
编辑:抛出的确切异常是:
Uncaught Exception: System.Web.HttpException (0x80004005): Server cannot set status after HTTP headers have been sent.
at System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult result)
at System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Run Code Online (Sandbox Code Playgroud) 我在Android中有一个http客户端将HTTP PUT请求发送到使用C#和ASP.NET WebApi框架实现的REST API.
只要JSON字段与C#类中的属性匹配,框架就应该能够将JSON神奇地转换(反序列化)到模型类(普通对象)中.
问题是当该HTTP请求来与块传输编码,使内容长度= 0(根据http://en.wikipedia.org/wiki/Chunked_transfer_encoding)和框架是不是能够映射内是这样的JSON Http请求消息,因此参数为null.
看这个简单的例子:
[HttpPut]
public HttpStatusCode SendData(int id, int count, [FromBody]MyData records, HttpRequestMessage requestMessage)
{
var content = requestMessage.Content;
string jsonContent = content.ReadAsStringAsync().Result; //this gets proper JSON
return HttpStatusCode.OK;
}
Run Code Online (Sandbox Code Playgroud)
问题是当客户端发送嵌入的http请求时,记录为空.
据我所知,Chunked Transfer编码只是一个传输属性,http客户端或服务器不应该担心应用层(传输层的业务).但似乎框架并没有按照我的意愿来管理它.
我可以从HttpRequestMessage手动检索JSON并将其反序列化为MyData对象,但我无法利用ASP.NET框架的魔力.而且您知道规则:您添加的代码越多,您可能会引入的错误就越多.
有没有办法处理带有JSON的Http Put请求,这些请求来自ASP.NET Web Api 2中的分块传输?
编辑:这是此示例的模型类,框架应在反序列化JSON时实例化
public class MyData
{
public string NamePerson {get; set;}
public int Age {get; set;}
public string Color {get; set;}
}
Run Code Online (Sandbox Code Playgroud) c# json http-content-length chunked-encoding asp.net-web-api
我正在使用Plupupload上传文件.如果我尝试加载exeIE9及其文件大小upload_max_filesize或post_max_size设置,则上传的文件已损坏.
这是我正在使用的PHP脚本:
<?php
/**
* upload.php
*
* Copyright 2013, Moxiecode Systems AB
* Released under GPL License.
*
* License: http://www.plupload.com/license
* Contributing: http://www.plupload.com/contributing
*/
// Make sure file is not cached (as it happens for example on iOS devices)
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// 5 minutes …Run Code Online (Sandbox Code Playgroud) 我正在建立到IIS Web服务器的HTTP连接,并发送一个POST请求,其中包含使用Transfer-Encoding:chunked编码的数据.当我这样做时,IIS只是关闭连接,没有错误消息或状态代码.根据HTTP 1.1规范,
所有HTTP/1.1应用程序必须能够接收和解码"分块"传输编码
所以我不明白为什么它(a)不处理该编码和(b)它没有发回状态代码.如果我更改发送Content-Length而不是Transfer-Encoding的请求,则查询会成功,但这并不总是可行的.
当我对Apache尝试相同的事情时,我得到一个"需要411长度"的状态和一条消息"chunked Transfer-Encoding forbidden".
为什么这些服务器不支持此编码?
chunked-encoding ×10
http ×3
apache ×2
javascript ×2
angularjs ×1
asp.net ×1
asp.net-mvc ×1
c# ×1
chunked ×1
http-1.1 ×1
http-chunked ×1
http-headers ×1
iis ×1
ios ×1
json ×1
nginx ×1
node.js ×1
php ×1
plupload ×1
q ×1