1. 程式人生 > >eclipse生成的webservice客戶端呼叫webservice介面返回值慢的問題

eclipse生成的webservice客戶端呼叫webservice介面返回值慢的問題

        最近在對接一個webservice介面的時候,為了方便直接用eclipse生成了webservice的客戶端,發現一個奇怪的問題,呼叫webservice的時候呼叫速度很快,但是返回資料很慢,每次需要5分鐘左右才能接收到服務端返回的值。奇葩就奇葩在隔了五分鐘才返回一個值。最後找了好久原因,發現情況eclipse生成的客戶端傳送的是基於HTTP 1.0的請求,如下圖:

       找了資料發現HTTP1.0和HTTP 1.1的區別:HTTP 1.0規定瀏覽器與伺服器只保持短暫的連線,瀏覽器的每次請求都需要與伺服器建立一個TCP連線,伺服器完成請求處理後立即斷開TCP連線,伺服器不跟蹤每個客戶也不記錄過去的請求。具體的見另一篇部落格:

http://blog.csdn.net/u012470138/article/details/53034301

     然後在客戶端加上宣告,宣告是HTTP1.1,只要加上一行程式碼:

_call.setPropert(org.apache.axis.MessageContext.HTTP_TRANSPORT_VERSION,

HTTPConstants.HEADER_PROTOCOL_V11);瞬間解決了這個問題,呼叫和獲得返回值十分的快。如下是服務端擷取的請求協議:

完整程式碼如下:

public java.lang.String getBlackPhone(java.lang.String account, java.lang.String password, java.lang.String phone) throws java.rmi.RemoteException {
        if (super.cachedEndpoint == null) {
            throw new org.apache.axis.NoEndPointException();
        }
        org.apache.axis.client.Call _call = createCall();

       //其實將下面那行程式碼放在createCall()這個方法裡面更通用
        _call.setProperty(org.apache.axis.MessageContext.HTTP_TRANSPORT_VERSION, HTTPConstants.HEADER_PROTOCOL_V11);

        _call.setOperation(_operations[0]);
        _call.setUseSOAPAction(true);
        _call.setSOAPActionURI("http://www.139.net/GetBlackPhone");
        _call.setEncodingStyle(null);
        _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE);
        _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);
        _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
        _call.setOperationName(new javax.xml.namespace.QName("http://www.139.net", "GetBlackPhone"));


        setRequestHeaders(_call);