axis2 webservices 411錯誤解決辦法
錯誤:org.apache.axis2.AxisFault: Transport error: 411 Error: Length Required
可能會導致這個問題的原因:
1、訪問地址經過端口映射
2、http協議版本不同造成的,在 HTTP1.0中,服務器就會省略response頭中的Content-Length而持續寫數據出去,當服務器掛了的話,它簡單地斷開連接。而經典的 HTTP客戶端會一直讀數據直到碰到-1(傳輸結束的標識符)。為了處理這個問題,HTTP1.1中增加了一個特殊的header:Transfer- Encoding:chunked,允許響應response被分塊chunked。每次向連接寫數據的時候會先計算大小,最后在response的尾部 以一個0長度的chunk塊標志着此次傳輸的結束。即HTTP1.1支持chunked編碼,它允許HTTP消息被分成多塊后再進行傳輸。 Chunking一般用在服務器響應response的時候,但是客戶端也可以chunk大的請求request。即Chunk編碼允許服務器在發送完 Header后,發送更多的Body內容。
解決方法:
axis2使用了Content- Encoding: chunked頭 ,所以我們在用axis2時為了避免這個問題需要將chunk開關關掉,設置方法(java):
1、 在根據wsdl文件生成的客戶端代碼中加入_serviceClient.getOptions().setProperty(HTTPConstants.CHUNKED, false) 取消chunk限制,加入位置如下:
2、在客戶端創建連接時設置 如下:
UserServiceStub stub = new UserServiceStub();
stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED,Boolean.FALSE);