C# 获取远程服务器时返回错误:(504)WebAPI的网关超时

C# 获取远程服务器时返回错误:(504)WebAPI的网关超时,c#,asp.net-web-api,webrequest,C#,Asp.net Web Api,Webrequest,我使用下面的代码通过WebRequest从我的C#代码进行API调用: public object GetData() { object response = ""; string token = "EF232354"; string baseUrl = ConfigurationManager.AppSettings["BaseURL"].ToString(); string endPoint = Configuration

我使用下面的代码通过WebRequest从我的C#代码进行API调用:

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;
}
有时我会:

消息:远程服务器返回错误:(504)网关超时

异常类型:System.Net.WebException


WebRequest一次可以发出多少个请求?

我正在修改这个问题,以演示对内存流的读取,这时我注意到响应没有被处理。这95%可能是你的潜在问题。Streams和StreamReader也是一次性的,应该使用using()闭包进行包装

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.
  }
}

您在任何给定时间反序列化了多少数据?在不确定响应数据是否紧凑、读取速度是否合理的情况下,我会有点担心将响应流输入反序列化程序。您可以尝试首先将响应流读入内存(内存流),关闭响应流,然后从内存流反序列化。这将有助于确保请求/响应的打开时间不会超过需要的时间。@StevePy感谢您的建议,但有时它在没有issue@StevePy是否需要处置请求正在使用的对象?或者设置Timeout属性?I流读取器是一次性的,因此这些读取器应该被释放/使用作用域。当服务处理多个请求或其他事务繁忙时,“有时工作,有时不工作”可以很容易地确定负载。连接超时没有区别,因此您应该尽可能快地读取响应。@StevePy有代码示例吗?