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; }
}
Ti capisce CONN_TIMEOUT = 600000 significa quanto molto tempo è? Hai stato StatusCode = NotFound significa errore del server http 404 –
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. –
@Romasz Puoi aiutarmi qui? –