Search code examples
c#asp.net-web-apiwebrequest

Getting The remote server returned an error: (504) Gateway Timeout for WebAPI


I am using below code to make an API call from my C# code with WebRequest:

public object GetData() 
{
 object response = "";
 string token = "EF232354";
 string baseUrl = ConfigurationManager.AppSettings["BaseURL"].ToString();
 string endPoint = ConfigurationManager.AppSettings["EndPoint"].ToString();

 var httpWebRequest = (HttpWebRequest) WebRequest.Create(baseUrl + endPoint);

 httpWebRequest.ContentType = "application/json";
 httpWebRequest.Method = HttpVerb.GET.ToString();
 httpWebRequest.Headers.Add("token", token);

 var httpResponse = (HttpWebResponse) httpWebRequest.GetResponse();
 Stream dataStream = httpResponse.GetResponseStream();
 StreamReader reader = new StreamReader(dataStream);

 using(JsonReader sdr = new JsonTextReader(reader)) 
 {
  JsonSerializer serializer = new JsonSerializer();
  response = serializer.Deserialize(sdr);
 }
  return response;
}

Sometimes I am getting:

Message: The remote server returned an error: (504) Gateway Timeout.

Exception Type: System.Net.WebException

And how many requests can WebRequest make at a time?


Solution

  • I was adapting the question to demonstrate reading to a memory stream, when I noticed that the response was not being disposed. This is 95% likely to be your underlying problem. Streams and StreamReaders are also disposable and should be wrapped with using() closures.

    public object GetData() 
    {
      object response = "";
      string token = "EF232354";
      string baseUrl = ConfigurationManager.AppSettings["BaseURL"].ToString();
      string endPoint = ConfigurationManager.AppSettings["EndPoint"].ToString();
    
      var httpWebRequest = (HttpWebRequest) WebRequest.Create(baseUrl + endPoint);
    
      httpWebRequest.ContentType = "application/json";
      httpWebRequest.Method = HttpVerb.GET.ToString();
      httpWebRequest.Headers.Add("token", token);
    
      using (var httpResponse = (HttpWebResponse) httpWebRequest.GetResponse())
      {
        using (Stream dataStream = httpResponse.GetResponseStream())
        {
          using (StreamReader reader = new StreamReader(dataStream))
          {
            using(JsonReader sdr = new JsonTextReader(reader)) 
            {
              JsonSerializer serializer = new JsonSerializer();
              response = serializer.Deserialize(sdr);
            }
            return response;
          }
        }
        httpResponse.Close(); // For good measure. *should* be covered by Dispose.
      }
    }