2016-02-04 35 views
6

Dzwonię do usługi sieci Web za pomocą interfejsu API RestSharp. Jednak napotykam problem polegający na tym, że gdy serwer zajmuje więcej czasu niż domyślny limit czasu RestClienta (tj. 100 sekund), zawsze otrzymuję StatusCode = NotFound. Próbowałem również twardy kod zarówno wartości Timeout, jak i ReadWriteTimeout, ale to nie pomogło. Czy ktoś może zasugerować, co można tutaj zrobić?Jak ustawić limit czasu dla RestClient w Windows Phone 8?

mojego kodu jest jak poniżej

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; 

    } 

gdzie CONN_TIMEOUT = 600000 i moja klasa manipulacja odpowiedź jest poniżej:

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); 
    } 


} 

i WebDownloadResult jest poniżej:

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

Rozumiesz CONN_TIMEOUT = 600000 czyli jak dużo czasu? Masz StatusCode = NotFound oznacza błąd serwera HTTP 404 –

+0

Nie dodałem CONN_TIMEOUT = 600000, który wynosi 10 minut, na początku rozpocząłem z 20 sekundami, 30 sekundami itd., A ponieważ serwer wykonuje pewne operacje, potrzeba trochę czasu, aby wyślij odpowiedź. A ponieważ zajmuje to więcej czasu niż 100 sekund, czyli domyślny limit czasu, pojawia się błąd NotFound, w innym przypadku usługa sieciowa działa idealnie. –

+0

@Romasz Czy możesz mi w tym pomóc? –

Odpowiedz

0

Kod jest prawdopodobnie za pomocą default HttpWebRequest.Timeout

Spróbuj przepuszczenie go w RestRequest wyraźnie tak -

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

Możesz spróbować lepszą wersję takiego -

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

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

Co to jest opcja? Post mówi, że nie zadziałało. –

+0

Opcja jest niczym innym, jak zmienną przechowującą limit czasu. I ten post mówi o innym/niezwiązanym zagadnieniu, chociaż skopiowany styl kodu jest bardzo zarządzany. Warto wypróbować te. – Arvin

+0

edytowany post, aby usunąć nieistotny link – Arvin