如何处理WebServices.Data.ServiceRequestException?
我有一个Windows服务,可以定期访问邮箱,通过如何处理WebServices.Data.ServiceRequestException?,service,exchangewebservices,Service,Exchangewebservices,我有一个Windows服务,可以定期访问邮箱,通过EWS处理新电子邮件 在启动并运行了几天后,它遇到了以下错误,导致服务停止。(类似Exchange服务的服务不可用) 我仍在调查错误是否只是暂时的,因为我仍在与其他团队共享的开发环境中,这些团队可能正在执行导致此错误的实现 问题:我是否可以知道处理此问题的最佳方法是使用try catch,其中catch将在我的主程序中再次运行GetNewEmail方法 下面是我的代码片段: List<EmailMessage> emailList
EWS
处理新电子邮件
在启动并运行了几天后,它遇到了以下错误,导致服务停止。(类似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;
}
List-emailList=GetNewEmail(类别);
公共静态列表GetNewEmail(字符串folderName)
{
FindItemsResults emailItemList;
List retrievedEmailList=新列表();
整数偏移=0;
bool-moritems=true;
常量int pageSize=9999;
if(服务!=null)
{
尝试
{
InitExchangeService();
SearchFilter sf=new SearchFilter.SearchFilterCollection(LogicalOperator.And,new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead,false));
FolderView fView=新FolderView(1000);
fView.Traversal=FolderTraversal.Deep;
//在下一行命中错误
FindFoldersResults findFolderResults=service.FindFolders(
WellKnownFolderName.Inbox,
新的FolderView(int.MaxValue){Traversal=FolderTraversal.Deep});
如果(findFolderResults.Folders.Count==0)
{
LogInfo(“收件箱中找不到文件夹”);
返回检索到的电子邮件列表;
}
其他的
{
foreach(findFolderResults.Folders中的Microsoft.Exchange.WebServices.Data.Folder文件夹)
{
if(folder.DisplayName==folderName)
{
while(更多项目)
{
ItemView视图=新的ItemView(页面大小、偏移量、偏移量基点.开始);
emailItemList=service.FindItems(folder.Id,sf,view);
foreach(emailItemList.Items中的var emailItem)
{
EmailMessage email=EmailMessage.Bind(服务,emailItem.Id);
retrievedEmailList.Add((EmailMessage)电子邮件);
}
如果(!emailItemList.MoreAvailable)
MoreItems=false;
如果(更多项目)
偏移量+=页面大小;
}
返回检索到的电子邮件列表;
}
}
}
}
捕获(例外情况除外)
{
AppLogger.LogError(例如,“”);
掷骰子;
}
}
返回检索到的电子邮件列表;
}
谢谢。因为EWS管理的API是一个客户端库,所以每当您使用将向Exchange服务器发送请求的方法时,应该在该代码周围设置一个Try-Catch块。错误可以来自客户端(例如网络、DNS、本地客户端问题),也可以来自服务器,作为一般501类型的错误,或者您接收到SOAP响应,其中包含底层服务响应错误代码,如Throttling(ServerBusy),其中有需要处理的回退。因此,如果您编写弹性代码,您的处理程序应该以不同的方式查找和处理这些异常(尽管大多数异常只需要重试,但如果您的邮箱被限制,重试间隔可能需要更改;如果邮箱在数据中心之间移动且暂时不可用,则在Office365中,重试间隔可能需要更改)