1

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

どんなアイデアでも役に立ちます。

ありがとう

4

1 に答える 1

1

リソースが不足している可能性があります。IDisposable を実装するオブジェクトのインスタンスを作成するときはいつでも、それを "using" ステートメントまたは try/finally ブロックでラップする必要があります。そうしないと、リソースが解放されるまでアプリケーションがハングアップします。

これにより、メソッドのスコープを離れるときに、リソースが適切に管理および解放されます。

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

あなたの場合、 Stream rs = request.GetRequestStream(); をラップする必要があります。および StreamReader リーダー = new StreamReader(response.GetResponseStream()); リソースをリークしないように。

また、コードを try/catch ブロックでラップし、例外をログに記録して、エラーを分析できるようにします。

于 2013-03-29T17:33:04.260 に答える