2014-09-13 78 views
1

我正在使用Android Azure移動服務SDK連接到Azure移動服務。 當我使用MobileServiceClient的invokeApi時,當Api在60秒內完成時,一切正常。MobileServiceClient invokeApi timeout

但是,當我的這個Api的方法獲取時間超過1分鐘時,「onCompleted」方法中的「異常」顯示「處理請求時出錯」。

我搜索了關於Android Azure Mobile Services SDK和MobileServiceClient類的所有文檔,我找不到任何有關此設置的約60秒的超時設置,供我配置。

任何人都可以點亮它嗎?

非常感謝。

+0

客戶端SDK中或服務器執行超時?我確信它正在客戶端上,但它起源於哪裏?你的自定義API做什麼會使它超時 - 發出一個出站HTTP請求? – 2014-09-17 16:16:04

回答

1
By default azure is using AndroidHttpClient. This has a default socket operation timeout 1 min(SOCKET_OPERATION_TIMEOUT = 60 * 1000) 

我們可以簡單地修改成

HttpConnectionParams.setConnectionTimeout(client.getParams(), SOCKET_OPERATION_TIMEOUT); 
     HttpConnectionParams.setSoTimeout(client.getParams(), SOCKET_OPERATION_TIMEOUT); 

    Inside azure sdk there is an interface ServiceFilterRequest and it holds a method 
    public ServiceFilterResponse execute() throws Exception; 

    We can edit this method and add our custom interval as follows. 
    1. Open its implementation class ServiceFilterRequestImpl. 
    2. set a connection interval time 

     // I'm changing the default 1 min to 5 minutes.. 
     private static final int SOCKET_OPERATION_TIMEOUT = 5 * 60 * 1000; 

    3. edit public ServiceFilterResponse execute() throws Exception { } method 

     public ServiceFilterResponse execute() throws Exception { 
      // Execute request 
      AndroidHttpClient client = mAndroidHttpClientFactory.createAndroidHttpClient(); 
      client.getParams().setParameter(HTTP.USER_AGENT, MobileServiceConnection.getUserAgent()); 


//Overriding the default interval with the desired connection timeout value. 
      HttpConnectionParams.setConnectionTimeout(client.getParams(), SOCKET_OPERATION_TIMEOUT); 
      HttpConnectionParams.setSoTimeout(client.getParams(), SOCKET_OPERATION_TIMEOUT); 



      try { 
       final HttpResponse response = client.execute(mRequest); 
       ServiceFilterResponse serviceFilterResponse = new ServiceFilterResponseImpl(response); 
       return serviceFilterResponse; 
      } finally { 
       client.close(); 
      } 
     } 

這將解決這個問題。

+0

這很酷!非常感謝! – Paul 2015-10-18 03:45:29

1

經過漫長的研究,事實證明,Android版Azure移動服務使用MobileServiceClient類,它使用AndroidHttpClient與我們的Azure移動服務網址進行SSL通信。 AND AndroidHttpClient,從這個帖子android httpclient hangs on second request to the server (connection timed out),有一個默認的「合理的」設置,即60秒超時的SSL訪問!我的天啊。

不知道是否有人在Android的Azure移動服務團隊中可以看到這篇文章,並找出一種方法讓我們直接在Android Azure移動服務類中配置超時設置。

4

實現您的自定義OkHttpClientFactory。例如:

public class MyOkHttpClientFactory implements OkHttpClientFactory { 
    @Override 
    public OkHttpClient createOkHttpClient() { 
     long timeout = 30_000; 
     TimeUnit unit = TimeUnit.MILLISECONDS; 
     OkHttpClient okClient = new OkHttpClient(); 

     okClient.setConnectTimeout(timeout, unit); 
     okClient.setReadTimeout(timeout, unit); 
     okClient.setWriteTimeout(timeout, unit); 

     return okClient; 
    } 
} 

,並設置這個類的一個實例來MobileServiceClient

MobileServiceClient mobileServiceClient = new MobileServiceClient(SERVICE_URL, Context); 
mobileServiceClient.setAndroidHttpClientFactory(new MyOkHttpClientFactory()); 

這對我的作品

爲OkHttpClient默認的超時值是10秒。