我们在IIS中查看工作进程时一直注意到挂起请求,我们最初认为指定HTTP超时值可以解决问题,但事实并非如此。我们找到了造成问题的代码段,但我们仍然不确定可能导致问题的原因。
以下代码片段接受键/值对列表并创建HTTP Post请求并将值放入POST有效内容中。它大部分时间都很好,但不确定可能导致问题的原因。
public List<KeyValuePair<string, string>> Data { get; set; }
public string Invoke()
{
StringBuilder paramBuilder = new StringBuilder();
for (int i = 0; i < Data.Count; i++)
{
var d = Data[i];
string delimeter = i < Data.Count - 1 ? "&" : string.Empty;
paramBuilder.AppendFormat("{0}={1}{2}", d.Key.Trim(), d.Value != null ? HttpUtility.UrlEncode(d.Value.Trim()) : string.Empty, delimeter);
}
WebRequest request = WebRequest.Create(Url);
request.ContentLength = paramBuilder.Length;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
Stream rs = request.GetRequestStream();
ASCIIEncoding encoding = new ASCIIEncoding();
var postData = encoding.GetBytes(paramBuilder.ToString());
rs.Write(postData, 0, postData.Length);
var response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string str = reader.ReadToEnd();
rs.Close(); //JUST ADDED _ MAYBE THESE WERE THE PROBLEM?
reader.Close(); //JUST ADDED - MAYBE THESE WERE THE PROBLEM?
return str;
}
任何想法都会有所帮助。
由于
答案 0 :(得分:1)
您的资源可能已耗尽。 每当您创建实现IDisposable的对象的实例时,您应该将其包装在“using”语句或try / finally块中。 如果不这样做,将导致应用程序挂起,直到资源被释放。
这将确保在您离开方法范围时正确管理和释放资源。
http://msdn.microsoft.com/en-gb/library/yh598w02(v=vs.100).aspx
在你的情况下,你应该换行 Stream rs = request.GetRequestStream(); 和 StreamReader reader = new StreamReader(response.GetResponseStream()); 这样你就不会泄漏资源。
另外,将代码包装在try / catch块中并记录异常,以便分析错误。