2013-03-29 20 views
1

在查看IIS中的工作进程时,我们注意到挂起请求,并且我们最初认为指定HTTP超时值可以解决问题,但事实并非如此。我们找到了导致问题的一段代码,但我们仍然不确定可能导致问题的原因。导致工作进程挂起的C#HTTP Post代码

以下代码片段将带入一个Key/Value对列表,并创建一个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; 
    } 

任何想法都会有所帮助。

谢谢

+1

这不会解决你的问题,我不认为(尽管它可以,取决于具体情况),但你应该习惯于使用'using'语句并正确处理一次性对象(Stream,StreamReader,和WebResponse)。你也不需要实例化ASCIIEncoding。只需使用'Encoding.ASCII.GetBytes()'方法即可。 – Pete

回答

1

您可能会用完资源。 无论何时创建实现IDisposable的对象实例,都应该将其包装在“using”语句或try/finally块中。 未能这样做会导致您的应用程序挂起,直到资源被释放。

这将确保资源在离开方法范围时得到适当的管理和释放。

http://msdn.microsoft.com/en-gb/library/yh598w02(v=vs.100).aspx

在你的情况,你应该换 流RS = request.GetRequestStream(); 和 StreamReader reader = new StreamReader(response.GetResponseStream()); 这样你就不会泄漏资源。另外,将代码包装在try/catch块中并记录异常,以便分析错误。