How to trap & repeat API request

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.
Hace 2 años
I have a plugin to get sales tax information from Sovos.  It uses httpWebRequest to get information.  At times the service returns a 500 error, if I hit refresh the call is successful.

What would be best way of catching error and retrying once before displaying 500 error?
Nop4.3 version

       public async Task<SovosResponse> GetTaxifyResponseAsync(SovosRequest SovosRequest, ILogger logger, bool tracing)
       {
           var headauth = GetAuthHeader();
           var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://sovos.com?state=EVALUATE");
           httpWebRequest.ContentType = "application/json";
           httpWebRequest.Headers.Add("x-request-date", svtime);
           httpWebRequest.Headers.Add("Authorization", headauth);
           httpWebRequest.Method = "POST";
           using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
           {
               var requestJson = JsonConvert.SerializeObject(SovosRequest);
               if (tracing && logger != null) logger.Information($"Sovos. Request: {requestJson}");
               streamWriter.Write(requestJson);
           }

           var httpResponse = await httpWebRequest.GetResponseAsync();

           using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
           {
               var resultJson = streamReader.ReadToEnd();
             //  resultJson = resultJson.Substring(5, resultJson.Length - 6); // remove extra wrapper {"d": ... }  
               if (tracing && logger != null) logger.Information($"Sovos. Response: {resultJson}");
               var response = JsonConvert.DeserializeObject<SovosResponse>(resultJson);
               return response;
           }
       }
Hace 2 años
try
const int MaxNumberOfAttempts = 2;

var numberOfAttempts = 1;
while (true)
{
  try
  {
    var httpResponse = await httpWebRequest.GetResponseAsync();
    break;
  }
  catch
  {
    if (numberOfAttempts++ >= MaxNumberOfAttempts)
      throw;
  }
}
Hace 2 años
When I attempt to add the try/catch, VS doesn't like the face that httpResponse is defined within the try/catch.  This line - using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))  is marked as httpResponse does not exist in current context.

What is best way to work around?



httpWebRequest.Method = "POST";
           using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
           {
               var requestJson = JsonConvert.SerializeObject(SovosRequest);
               if (tracing && logger != null) logger.Information($"Sovos. Request: {requestJson}");
               streamWriter.Write(requestJson);
           }
            var numberOfAttempts = 1;
            while (true)
            {
                try
                {
                    var httpResponse = await httpWebRequest.GetResponseAsync();
                    break;
                }
                catch
                {
                    if (numberOfAttempts++ >= MaxNumberOfAttempts)
                        throw;
                }
            }
           using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
           {
               var resultJson = streamReader.ReadToEnd();
               if (tracing && logger != null) logger.Information($"Sovos. Response: {resultJson}");
               var response = JsonConvert.DeserializeObject<SovosResponse>(resultJson);
               return response;
           }
Hace 2 años
I think I figured it out - this seems to work.

httpWebRequest.Method = "POST";
           using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
           {
               var requestJson = JsonConvert.SerializeObject(SovosRequest);
               if (tracing && logger != null) logger.Information($"Sovos. Request: {requestJson}");
               streamWriter.Write(requestJson);
           }
            var numberOfAttempts = 1;
            var htp1 = new HttpWebResponse();
            while (true)
            {
                try
                {
                    htp1 = (HttpWebResponse)await httpWebRequest.GetResponseAsync();
                    break;
                }
                catch
                {
                    if (tracing && logger != null) logger.Information($"Sovos. Response: Number of attempts {numberOfAttempts} ");
                    if (numberOfAttempts++ >= MaxNumberOfAttempts)
                        throw;
                }
            }
           using (var streamReader = new StreamReader(htp1.GetResponseStream()))
           {
               var resultJson = streamReader.ReadToEnd();
               if (tracing && logger != null) logger.Information($"Sovos. Response: {resultJson}");
               var response = JsonConvert.DeserializeObject<SovosResponse>(resultJson);
               return response;
           }
       }
This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.