导致工作进程挂起的c# HTTP Post代码

本文关键字:HTTP Post 代码 挂起 工作 进程 | 更新日期: 2023-09-27 18:06:44

在查看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;
    }

任何想法都会有帮助。

谢谢

导致工作进程挂起的c# HTTP Post代码

您可能正在耗尽资源。当你创建一个实现了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块中,并记录异常,以便您可以分析错误。