如何处理WebServices.Data.ServiceRequestException?

How to Handle WebServices.Data.ServiceRequestException?

我有一个 Windows 服务,可以定期访问邮箱以通过 EWS 处理新电子邮件。

装好 运行ning 几天后,出现如下错误,导致服务停止。 (类似 Exchange 服务不可用)

我仍在调查错误是否只是暂时的,因为我仍在与其他团队共享的开发环境中,这些团队可能正在执行导致此错误的某些实现。


问题:请问最好的处理方法是使用 try-catch,其中 catch 将 运行在我的主程序中再次使用 GetNewEmail 方法?


下面是我的代码片段:

List<EmailMessage> emailList = GetNewEmail(category);

public static List<EmailMessage> GetNewEmail(string folderName)
{
    FindItemsResults<Item> emailItemList;
    List<EmailMessage> retrievedEmailList = new List<EmailMessage>();
    int offset = 0;
    bool MoreItems = true;
    const int pageSize = 9999;

    if (service != null)
    {
        try
        {
            InitExchangeService();

            SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
            FolderView fView = new FolderView(1000);
            fView.Traversal = FolderTraversal.Deep;

            //error hit at the following line
            FindFoldersResults findFolderResults = service.FindFolders(
                WellKnownFolderName.Inbox,
                new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep });

            if (findFolderResults.Folders.Count == 0)
            {
                AppLogger.LogInfo("No folders found in Inbox.");
                return retrievedEmailList;
            }

            else
            {
                foreach (Microsoft.Exchange.WebServices.Data.Folder folder in findFolderResults.Folders)
                {
                    if (folder.DisplayName == folderName)
                    {
                        while (MoreItems)
                        {
                            ItemView view = new ItemView(pageSize, offset, OffsetBasePoint.Beginning);
                            emailItemList = service.FindItems(folder.Id, sf, view);

                            foreach (var emailItem in emailItemList.Items)
                            {
                                EmailMessage email = EmailMessage.Bind(service, emailItem.Id);
                                retrievedEmailList.Add((EmailMessage)email);
                            }

                            if (!emailItemList.MoreAvailable)
                                MoreItems = false;

                            if (MoreItems)
                                offset += pageSize;
                        }
                        return retrievedEmailList;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            AppLogger.LogError(ex, "");
            throw ex;
        }
    }
    return retrievedEmailList;
}

谢谢。

因为 EWS Managed API 是一个客户端库,只要您使用将向 Exchange 服务器发送请求的方法,您就应该在该代码周围设置一个 Try Catch 块。错误可能来自客户端(例如网络、DNS、本地客户端问题)或来自服务器,作为一般的 501 类型错误,或者您收到带有基础服务响应错误代码的 SOAP 响应,例如 Throttling (ServerBusy),它有退避你需要处理。因此,如果您编写有弹性的代码,您的处理程序应该以不同的方式查找和处理这些异常中的每一个(尽管大多数只需要重试,但如果您受到限制或在 Office365 中,如果邮箱正在运行,则重试的间隔可能需要更改在数据中心之间移动并暂时不可用等)。