C# 获取远程服务器时返回错误:(504)WebAPI的网关超时
我使用下面的代码通过WebRequest从我的C#代码进行API调用: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
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有代码示例吗?