0

这是我的方法:

private static void UpdatePref(List<EmailPrefer> prefList)
{
    if(prefList.Count > 0)
    {
        foreach (EmailPref pref in prefList)
        {
            UpdateEmailRequest updateRequest = new UpdateEmailRequest(pref.ID.ToString(), pref.Email, pref.ListID.ToString());
            UpdateEmailResponse updateResponse =(UpdateEmailResponse) updateRequest.SendRequest();

            if (updateResponse.Success)
            {
                Console.WriteLine(String.Format("Update Succsesful.  ListID:{0}  Email:{2}  ID:{1}", pref.ListID, pref.Email, pref.ID));
                continue;
            }
            Console.WriteLine( String.Format("Update Unsuccessful.  ListID:{0}  Email:{2}  ID:{1}\n", pref.ListID, pref.Email, pref.ID));
            Console.WriteLine(String.Format("Error:{0}", updateResponse.ErrorMessage));
        }

        Console.WriteLine("Updates Complete.");
    }
    Console.WriteLine("Procses ended.  No records found to update");
}

该列表有大约 84 条有效记录,它正在循环并发送 API 请求。但它在第 3 次 API 调用时停止,仅处理 84 条记录中的 2 条。当我调试以查看发生了什么时,我只看到它在我的 SendRequest 方法中停止,而没有吐出任何错误。它在 GetRequestStream 处停止,当我走到那里并尝试继续前进时,它就停止了,我的应用程序停止运行而没有任何错误!

HttpWebRequest request = CreateWebRequest(requestURI, data.Length);
request.ContentLength = data.Length;
request.KeepAlive = false;
request.Timeout = 30000;

// Send the Request
requestStream = request.GetRequestStream();

什么?最终,如果我让它继续运行,我确实会收到错误“操作已超时”。但是,为什么前 2 个调用通过而这个超时呢?我不明白。

另外,第二个问题。让它在我的 foreach 中创建一个新对象用于发送和接收是否效率低下?但这就是我删除这些类的方式,并要求电子邮件、ListID 等是发送该类型 API 调用的必要条件。我只是不知道通过 foreach 中的每次迭代创建一个新实例是否有效。可能很常见,但对我来说只是觉得奇怪和低效。

4

2 回答 2

1

编辑:看来你已经在评论中回答了你自己的问题。

我没有这方面的个人经验,但在您获取响应后,您似乎需要在 HTTP Web 请求上调用 close 。打开的连接数限制为 2,并且在您关闭()之前不会释放连接。请参阅http://blogs.msdn.com/feroze_daud/archive/2004/01/21/61400.aspx,它提供了以下代码来演示您所看到的症状。

    for(int i=0; i < 3; i++) {
       HttpWebRequest r = WebRequest.Create(“http://www.microsoft.com“) as HttpWebRequest;
       HttpWebResponse w = r.GetResponse() as HttpWebResponse;
    }
于 2009-03-23T04:17:03.297 回答
0

它超时的一种可能性是您正在与之交谈的服务器正在限制您。您可以尝试在每次更新后插入延迟(可能是一秒钟?)。

假设UpdateEmailRequestandUpdateEmailResponse以某种方式分别从WebRequestand派生而来WebResponse,那么以您的方式创建请求并不是特别低效。这很标准。但是,请注意,这意味着它可能分配了非托管资源,您应该通过调用该方法来处理WebResponse它。像这样的东西:IDisposableDispose

UpdateEmailResponse updateResponse =(UpdateEmailResponse) updateRequest.SendRequest();
try
{
    if (updateResponse.Success)
    {
        Console.WriteLine(String.Format("Update Succsesful.  ListID:{0}  Email:{2}  ID:{1}", pref.ListID, pref.Email, pref.ID));
        continue;
    }
    Console.WriteLine( String.Format("Update Unsuccessful.  ListID:{0}  Email:{2}  ID:{1}\n", pref.ListID, pref.Email, pref.ID));
    Console.WriteLine(String.Format("Error:{0}", updateResponse.ErrorMessage));
}
finally
{
    updateResponse.Dispose();
}

我想有可能不处理响应对象会保持与服务器的打开连接,并且服务器超时,因为您有太多打开的连接。

于 2009-03-23T04:01:37.813 回答