2016-02-04 5 views
6

Ich rufe einen Webservice mit RestSharp API.Aber ich habe ein Problem, dass, wenn der Server mehr Zeit als RestClient Standard-Timeout dauert (dh 100 Sekunden) in diesem Fall bekomme ich immer StatusCode = NotFound. Ich habe auch versucht Hard-Code sowohl Timeout und ReadWriteTimeout Parameter Wert, aber es hat nicht geholfen. Kann jemand vorschlagen, was hier getan werden kann?Wie Timeout für RestClient in Windows Phone 8 festlegen?

My-Code ist als unten

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; 

    } 

wo conn_timeout = 600000 und meine Antwort Handling Klasse unten:

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


} 

und WebDownloadResult unten:

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

Verstehst du conn_timeout = 600000 bedeutet, wie viel Zeit sein? Sie haben StatusCode = NotFound bedeutet 404 http Server Fehler –

+0

Ich habe nicht hinzugefügt CONN_TIMEOUT = 600000, die 10 Minuten ist, zuerst begann ich mit 20 Sekunden, 30 Sekunden usw. und da der Server einige Operationen ausführt dauert es eine Weile sende eine Antwort. Und da es mehr Zeit als 100 Sekunden dauert, was eine Standardzeitüberschreitung ist, erhalte ich NotFound-Fehler, sonst funktioniert es für andere Webdienste einwandfrei. –

+0

@Romasz Können Sie mir hier helfen? –

Antwort

0

Der Code wird mit wahrscheinlich default HttpWebRequest.Timeout

Bitte versuchen Sie es in RestRequest vorbei explizit so -

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

Sie können eine bessere Version wie diese versuchen -

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

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

Was ist Optionen? Der Beitrag sagt, es hat nicht funktioniert. –

+0

Option ist nichts anderes als eine Variable, die Timeout hält. Und dieser Beitrag spricht von einem anderen/nicht verwandten Problem, obwohl der überkopierte Code-Stil viel verwaltet wird. Es sollte sich lohnen, diese auszuprobieren. – Arvin

+0

bearbeitet Post, um irrelivent Link zu entfernen – Arvin