有反向代理( Nginx )时 Hessian 的 411 错误解决方案

Hessian 是个轻量级的跨平台的远程过程调用框架(RPC)。我在目前的项目中使用其 java 服务器端和 iOS 客户端(HessianKit)。

在项目开发过程中 HessianKit 能顺利的从服务器获取数据,但是在公司外网测试环境中就会得到 411 的错误代码。经查找该问题发生在 Nginx,因为在开发环境中客户端直接连接 Tomcat,而在测试环境中则有 Nginx 作负载均衡。

原因:

首先来看下HTTP 411错误的解释: LengthRequired 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)这是因为Hessian与服务端通信默认是采取分块的方式(chunked encoding)发送数据,而反向代理要获得Content-Length这个头,才能处理请求,但是Hessian的请求中并没有加入这个参数。【引自博客A

博客A中对该问题的解决方案是调用 HessianProxyFactory 实例的setChunckedPost() 方法,赋值为false,让其不采用分块传输。不过这样的方案并不适合我,因为我用的是 iOS 平台的 Hessian 客户端 HessianKit 。而 HessianKit 并没有提供这个接口。据我对 HessianKit 源码的简单了解,它采用 NSMutableURLRequest 来进行网络访问,而 iOS SDK 中也并没有提供设置是否分块的功能。因此对我来说最好从 Nginx 端来解决,也是为了多平台的考虑,不希望以后每个客户端都去折腾一遍。

解决方案:

最终通过【博客B】找到解决方案,通过加入新的模块,重新编译并配置 Nginx,完美解决。

我将编译步骤记录在了我的另一篇博客中,详细请参考【我的博客】


参考博客:

【博客A】http://blog.csdn.net/zhtang0526/article/details/4793157

【博客B】http://blog.chinaunix.net/uid-16974460-id-296023.html

【我的博客】http://blog.csdn.net/fangzhangsc2006/article/details/8122273


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值