【问题标题】:c# - Exchange Web Service API and 401 unauthorized exceptionc# - Exchange Web Service API 和 401 未经授权的异常
【发布时间】:2017-03-23 14:06:19
【问题描述】:

以下 EWS 调用偶尔会产生 401 错误(每 1000 封电子邮件中有 1 封)已处理。

emailMessage.Load(propertySet);

emailMessage.Move(WellKnownFolderName.DeletedItems);

关于问题是什么的任何想法?电子邮件驻留在收件箱中,并受到许多规则扫描(由于驻留在收件箱中),但规则不会将它们从收件箱中删除。稍后重新处理同一电子邮件将成功。凭据或仅具有静态引用的 propertySet 没有问题。就好像 emailMessage 虽然是从 service.FindItems() 检索到的,但具有临时权限。我在 EWS 日志中没有看到任何相应的错误。

为了澄清,应用于收件箱的规则正在移动其他电子邮件。严格来说,我不知道 ES(+message labs)在将电子邮件放入收件箱之前是否应用了规则(例如跨度检查等)。如果在插入后应用,我可以理解可能有 2 个进程针对收件箱工作,可能同时进行。如果是这样,我不知道可能会产生什么影响。这都是猜测 - 我不知道这是否与我的问题有关。但是,异常表明 401 来自 EWS 响应,即使我在 EWS 日志中没有找到相同的内容。

Error: Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. The remote server returned an error: (401) Unauthorized. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized.
   at System.Net.HttpWebRequest.GetResponse()
   at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.Microsoft.Exchange.WebServices.Data.IEwsHttpWebRequest.GetResponse()
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)
   --- End of inner exception stack trace ---
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request)
   at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
   at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalLoadPropertiesForItems(IEnumerable`1 items, PropertySet propertySet, ServiceErrorHandling errorHandling)
   at Microsoft.Exchange.WebServices.Data.Item.InternalLoad(PropertySet propertySet)

Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. The remote server returned an error: (401) Unauthorized. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized.
   at System.Net.HttpWebRequest.GetResponse()
   at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.Microsoft.Exchange.WebServices.Data.IEwsHttpWebRequest.GetResponse()
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)
   --- End of inner exception stack trace ---
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request)
   at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
   at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalMoveItems(IEnumerable`1 itemIds, FolderId destinationFolderId, Nullable`1 returnNewItemIds, ServiceErrorHandling errorHandling)
   at Microsoft.Exchange.WebServices.Data.ExchangeService.MoveItem(ItemId itemId, FolderId destinationFolderId)
   at Microsoft.Exchange.WebServices.Data.Item.Move(FolderId destinationFolderId)
   at Microsoft.Exchange.WebServices.Data.Item.Move(WellKnownFolderName destinationFolderName)

【问题讨论】:

  • 如果看起来是零星的,您可以尝试添加瞬态错误处理。或者 .. 给我们一个完整的例外。
  • 我可能会回退到重试策略,没有意识到这是一个如此正式的模式 - 谢谢。不过如果能解决核心问题就好了。

标签: c# exchangewebservices


【解决方案1】:

此问题可能导致 Microsoft Office 365 提供的两步验证。最好创建应用密码并传递该密码,而不是 Outlook 密码。

exchangeService.Credentials = new WebCredentials("email", "app-pwd");

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 2015-11-13
    • 2017-02-07
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多