如何处理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 中,如果邮箱正在运行,则重试的间隔可能需要更改在数据中心之间移动并暂时不可用等)。
我有一个 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 中,如果邮箱正在运行,则重试的间隔可能需要更改在数据中心之间移动并暂时不可用等)。