从EWS(交换Web服务)服务器读取的电子邮件无法处理此请求错误c#

时间:2015-03-06 19:19:39

标签: linq c#-4.0 exchangewebservices

我有一项任务,我需要检查发送到我邮箱的电子邮件并根据我必须完成的任务来阅读它们。但出于演示目的,我只提出了更新电子邮件阅读状态的基本功能

基本连接和创建服务对象一切正常:

///////////

    NetworkCredential credentials = new NetworkCredential(securelyStoredEmail, securelyStoredPassword);

    ExchangeService _service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
_service.Credentials = credentials;

    _service.AutodiscoverUrl("User1@contoso.com");

///////////////////////// 这里一切都很好。但是,我将使用可观察的反应性linq事件每60秒调用以下方法。这是去查看我的电子邮箱,每60秒阅读100封电子邮件。 一切都很好,直到某个时候。有时当控件到达parallel.foreach循环内的代码行时,它会显示错误消息,例如'服务器现在无法处理此请求。请稍后再尝试这样的事情。这个错误恰好出现在

var email = EmailMessage.Bind(_service, findItemsResult.Id, emailProps);

因此,每60秒,我有时会得到这个错误。有时它工作正常。 以下是每60秒执行一次的方法。就像我每60秒尝试阅读“myaccount.com”的电子邮件一样,我得到错误'服务器无法处理'。

internal void GetEmailsFrommymailbox()
{ 

try
{

var view = new ItemView(100);
var userMailbox = new Mailbox(userMailbox);
var folderId = new FolderId(WellKnownFolderName.Inbox, userMailbox);
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And,
new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));



var findResults = _service.FindItems(folderId, sf, view);
var emailProps = new PropertySet(ItemSchema.MimeContent, ItemSchema.Body,
ItemSchema.InternetMessageHeaders);

Parallel.ForEach(findResults, findItemsResult =>
{


///////////// this is the line where i get error////////

    var email = EmailMessage.Bind(_service, findItemsResult.Id, emailProps);

//// above is the place where i get error

var emailMatching = email;
try
{
email.IsRead = true;
email.Update(ConflictResolutionMode.AutoResolve);

}
catch (Exception emailreadFromBccException)
{
Logger.Warn(emailreadFromBccException + " Unable to update email read status");
}


});
}

}

1 个答案:

答案 0 :(得分:2)

您收到该错误是因为您受到限制https://msdn.microsoft.com/en-us/library/office/jj945066%28v=exchg.150%29.aspx而且您受到限制,因为您的代码效率不高。

而不是做

Parallel.ForEach(findResults,findItemsResult => {

/////////////这是我收到错误的行////////

var email = EmailMessage.Bind(_service, findItemsResult.Id, emailProps);

您应该使用LoadPropertiesFromItems http://blogs.msdn.com/b/exchangedev/archive/2010/03/16/loading-properties-for-multiple-items-with-one-call-to-exchange-web-services.aspx。这将减少您需要对服务器进行的呼叫次数。

我还建议您使用流式通知https://msdn.microsoft.com/en-us/library/office/hh312849%28v=exchg.140%29.aspx?f=255&MSPPError=-2147217396,这意味着您不需要每60秒轮询一次服务器,只需在新项目到达时采取措施。

干杯 格伦