2016-02-04 24 views
6

Sto chiamando un servizio Web usando l'API RestSharp.Ma sto affrontando un problema che quando il server impiega più tempo del timeout predefinito di RestClient (cioè 100 secondi) in quel caso mi viene sempre richiesto StatusCode = NotFound. Ho anche provato a hard code entrambi i valori dei parametri Timeout e ReadWriteTimeout ma non è stato d'aiuto. Qualcuno può suggerire cosa si può fare qui?Come impostare il timeout per RestClient in Windows Phone 8?

Il mio codice è il seguente

public async Task<WebDownloadResult> SyncMobileData(string encryptedstring) 
    { 
     WebDownloadResult response = new WebDownloadResult(); 
     var client = new RestClient(BaseUrl + Constants.WEB_SERVICE_NAME); 
     client.Timeout = CONN_TIMEOUT; 
     client.ReadWriteTimeout = CONN_TIMEOUT; 
     var request = new RestRequest(Method.POST); 

     byte[] encryptedbytes=System.Text.Encoding.UTF8.GetBytes(encryptedstring); 
     request.AddParameter("", encryptedbytes, ParameterType.RequestBody); 

     try 
     { 
      response = await client.GetResponseBytesAsync(request); 
     } 
     catch (Exception outer) 
     { 
      response.ErrorOccured = true; 
      response.ErrorMessage = outer.Message; 
     } 
     return response; 

    } 

dove CONN_TIMEOUT = 600000 e la mia risposta classe trattare è di seguito:

public static class RestClientExtensions 
{ 
    private static Task<T> GetResponseFromServer<T>(this RestClient client, IRestRequest request, Func<WebDownloadResult, T> selector) 
    { 
     var tcs = new TaskCompletionSource<T>(); 
     WebDownloadResult webResponse = new WebDownloadResult(); 
     var loginResponse = client.ExecuteAsync(request, r => 
     { 

      if (r.ErrorException == null && r.StatusCode == HttpStatusCode.OK) 
      { 
       webResponse.StatusCode = r.StatusCode; 
       webResponse.StatusCodeNumber = (int)r.StatusCode; 
       webResponse.Result = r.Content; 
       webResponse.ErrorOccured = r.StatusCode == HttpStatusCode.OK ? false : true; 
       tcs.SetResult(selector(webResponse)); 
      } 
      else 
      { 
       tcs.SetException(new Exception(r.StatusCode.ToString())); 
      } 

     }); 
     return tcs.Task; 
    } 

    private static Task<T> GetResponseFromServerForMW<T>(this RestClient client, IRestRequest request, Func<WebDownloadResult, T> selector) 
    { 
     var tcs = new TaskCompletionSource<T>(); 
     WebDownloadResult webResponse = new WebDownloadResult(); 
     var loginResponse = client.ExecuteAsync(request, r => 
     { 

      if (r.ErrorException == null && r.StatusCode == HttpStatusCode.OK) 
      { 
       webResponse.StatusCode = r.StatusCode; 
       if (r.Headers.FirstOrDefault(header => header.Name.Equals("P_RET_SYNC_ID")).Value != null) 
       { 
        webResponse.AdditionalParameter = r.Headers.FirstOrDefault(header => header.Name.Equals("P_RET_SYNC_ID")).Value; 

       } 
       webResponse.StatusCodeNumber = (int)r.StatusCode; 
       webResponse.Result = r.RawBytes; 
       webResponse.ErrorOccured = r.StatusCode == HttpStatusCode.OK ? false : true; 
       tcs.SetResult(selector(webResponse)); 
      } 
      else 
      { 
       tcs.SetException(new Exception(r.StatusCode.ToString())); 

      } 

     }); 
     return tcs.Task; 
    } 

    private static Task<T> GetRawResponseFromServer<T>(this RestClient client, IRestRequest request, Func<WebDownloadResult, T> selector) 
    { 
     var tcs = new TaskCompletionSource<T>(); 
     WebDownloadResult webResponse = new WebDownloadResult(); 
     var loginResponse = client.ExecuteAsync(request, r => 
     { 
      if (r.ErrorException == null && r.StatusCode == HttpStatusCode.OK) 
      { 
       webResponse.StatusCode = r.StatusCode; 
       webResponse.StatusCodeNumber = (int)r.StatusCode; 
       webResponse.Result = r.RawBytes; 
       webResponse.ErrorOccured = r.StatusCode == HttpStatusCode.OK ? false : true; 
       tcs.SetResult(selector(webResponse)); 
      } 
      else 
      { 
       tcs.SetException(new Exception(r.StatusDescription)); 
      } 

     }); 
     return tcs.Task; 
    } 

    public static Task<WebDownloadResult> GetResponseAsync(this RestClient client, IRestRequest request) 
    { 
     return client.GetResponseFromServer(request, r => r); 
    } 

    public static Task<WebDownloadResult> GetResponseAsyncForMW(this RestClient client, IRestRequest request) 
    { 
     return client.GetResponseFromServerForMW(request, r => r); 
    } 

    public static Task<WebDownloadResult> GetResponseBytesAsync(this RestClient client, IRestRequest request) 
    { 
     return client.GetRawResponseFromServer(request, r => r); 
    } 


} 

e WebDownloadResult è qui sotto:

public class WebDownloadResult 
{ 
    public HttpStatusCode StatusCode { get; set; } 
    public string ErrorMessage { get; set; } 
    public int StatusCodeNumber { get; set; } 
    public bool ErrorOccured { get; set; } 
    public object Result { get; set; } 
    public object AdditionalParameter { get; set; } 
} 
+0

Ti capisce CONN_TIMEOUT = 600000 significa quanto molto tempo è? Hai stato StatusCode = NotFound significa errore del server http 404 –

+0

Non ho aggiunto CONN_TIMEOUT = 600000 che è 10 minuti, all'inizio, ho iniziato con 20 secondi, 30 secondi ecc. E poiché il server sta eseguendo alcune operazioni, ci vuole un po 'di tempo per invia una risposta. E poiché richiede più tempo di 100 secondi che è il timeout predefinito, ricevo l'errore NotFound, altrimenti per altri servizi Web funziona perfettamente. –

+0

@Romasz Puoi aiutarmi qui? –

risposta

0

Il tuo codice probabilmente sta usando default HttpWebRequest.Timeout

prega Prova a passare in RestRequest esplicitamente come questo -

request.AddParameter("Timeout", options.Timeout.Value); 

Si può provare una versione migliore come questo -

var client = new RestClient(baseUrl) 
{ 
    Timeout = someTimeoutInMilliseconds 
}; 

var request = new RestRequest(url) 
{ 
    Method = Method.GET, 
    Timeout = someTimeoutInMilliseconds 
}; 
+0

Che cosa sono le opzioni? Il post dice che non ha funzionato. –

+0

L'opzione non è altro che una variabile che contiene il timeout. E quel post parla di un altro problema non correlato sebbene lo stile del codice copiato sia molto gestito. Vale la pena provare questi. – Arvin

+0

post modificato per rimuovere il collegamento irrelivent – Arvin