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 中的错误:已添加具有相同键的项目。在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at WebAPICommunicator.Utility .MakeRequest(字符串地址API)”。

我想知道为什么它调用了这么多次,并且我在 Logger 中看到的错误数量相同。

现在我已经包括

最后 {

            r.Abort();

        }

它能解决问题吗?

4

1 回答 1

0

首先是您不要在 finally 块中处理流。其次,您的异常将永远不会被重新抛出,因为在 catch 中的“return null”之后不会执行任何操作,“throw ex;” 是死代码。由于您使用 while 而不是 if,您的异常被抛出:

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

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

字典不能包含重复的键,这就是您第二次从 xml 读取相同键时发生的情况。

于 2013-04-29T09:48:49.437 回答