0

Web サービス (.asmx) で次のコードを使用して WEB API 呼び出しを呼び出しています。

        Server.ScriptTimeout = 3600; 
        return util.util.Settle(ids, userName, userPwd, userBelongCountry);

Settle メソッドは、以下のように MakeRequest() を呼び出します。

   public Dictionary<string, string> MakeRequest(string addressAPI)
    {
        HttpWebRequest r=null;
        try
        {
            r = (HttpWebRequest)WebRequest.Create(addressAPI);
            r.Method = "Get";
            HttpWebResponse res = (HttpWebResponse)r.GetResponse();
            Stream sr = res.GetResponseStream();
            StreamReader sre = new StreamReader(sr);
            var s = sre.ReadToEnd();
            sre.Close();
            XDocument doc = XDocument.Parse(s);
            foreach (XElement element in doc.Descendants().Where(p => p.HasElements == false))
            {
                int keyInt = 0;
                string keyName = element.Name.LocalName;

                while (!this.dataDictionary.ContainsKey(keyName))
                {
                    keyName = element.Name.LocalName + "_" + keyInt++;
                    this.dataDictionary.Add(keyName, element.Value);
                }
            }

            return this.dataDictionary;
        }
        catch (Exception ex)
        {
            SystemLogWebCom.Error("Error in WEBAPI call" + ex.ToString());            
            return null;
            throw ex;
        }

    }

問題: 例外が発生した場合、WEB API が約 15000 回以上連続して呼び出されます。一度実行して戻ってくるはずです。

ロガーに記録されたエラー:「WEBAPI callSystem.ArgumentException のエラー: 同じキーを持つ項目が既に追加されています。 .MakeRequest(文字列アドレス API)".

呼び出している回数と、ロガーで確認できるエラーの数が同じである理由を知りたいです。

今、私は含めました

最後に {

            r.Abort();

        }

それは問題を解決できますか?

4

1 に答える 1

0

1 つ目は、finally ブロックでストリームを破棄しないことです。そして第二に、キャッチの「return null」、「throw ex;」の後に何も実行されないため、例外が再スローされることはありません。デッドコードです。if の代わりに while を使用しているため、例外がスローされました。

while (!this.dataDictionary.ContainsKey(keyName))

if (!this.dataDictionary.ContainsKey(keyName))

辞書に重複したキーを含めることはできません。これは、xml から同じキーを 2 回目に読み取ったときに発生していることです。

于 2013-04-29T09:48:49.437 に答える