使用 EWS 和 C# 获取附件失败并出现 ServiceMethodException

Getting an attachment using EWS and C# failing with ServiceMethodException

所以我目前正在构建一个应用程序,允许一组用户查看来自某个电子邮件地址的所有电子邮件。这一切都正常工作。当我试图获取附件时,我遇到了问题。

我是这个领域的新手,使用了 Microsoft 找到的示例 here. 将其与我的以下代码进行比较:

    protected internal override Stream GetAttachmentStreamFinal(MailAttachmentDetails attachment)
    {
        var response = m_service.GetAttachments(new[] { attachment.Id }, BodyType.Text, Enumerable.Empty<PropertyDefinitionBase>());
        if (response.OverallResult != ServiceResult.Success)
        {
            if (response.Count > 0)
            {
                var ex = new MailException(response[0].ErrorMessage);
                ex.Data.Add(response[0].ErrorCode, response[0].ErrorMessage);
                foreach (var ed in response[0].ErrorDetails)
                {
                    ex.Data.Add(ed.Key, ed.Value);
                }
                throw ex;
            }
            throw new MailException("Error occurred while fetching the attachment from the mail service.");
        }

        foreach (var attachmentResponse in response)
        {
            if (attachmentResponse.Attachment is FileAttachment)
            {
                var fa = attachmentResponse.Attachment as FileAttachment;
                var cs = new MemoryStream(fa.Content);
                fa.Load(cs);
                cs.Seek(0, SeekOrigin.Begin);
                return cs;
            }
        }
        return null;
    }

如您所见,两组代码非常相似。但是,当我逐步进入 attachmentResponse.Attachment is FileAttachment 行时,我抛出了这个错误

Attempt by method 'Mail.ExchangeEmailService.GetAttachmentStreamFinal(Mail.MailAttachmentDetails)' to access method 'Microsoft.Exchange.WebServices.Data.GetAttachmentResponse.get_Attachment()' failed.

一切都被正确传递并且响应 returns 成功。

我在单步执行我的代码时注意到,附件显示为非 public 成员。但是由于这是封装在 Microsoft 中的 class 我不确定为什么会这样或者我能做什么?

确保您拥有最新版本的Microsoft.Exchange.WebServices.dll。旧版本在调用 GetAttachments 方法的特定重载时没有 return 实际附件数据。

我只想扩展@Jason Johnstons 的回答。

出于某种原因,NuGet 中的 EWS 版本不正确。它会引发您遇到的错误。

解决方法是通过

删除对 NuGet 包的引用
Uninstall-Package Microsoft.Exchange.WebServices

然后在此处下载并 运行 MSI 文件

https://www.microsoft.com/en-us/download/details.aspx?id=42951

这会将您需要的 DLL 安装到

的默认位置
[ C:\Program Files\Microsoft\Exchange\Web Services.2 ]

然后简单地将它们复制到您的 lib 目录(或类似目录)并直接创建对 DLL 的引用。

来源:http://www.resolvinghere.com/sm/microsoftexchangewebservicesdatagetattachmentresponsegetattachment-failed.shtml

正如其他答案已经提到的,Microsoft 的 nuget 包不是最新的。我也遇到了和楼主一样的问题。

首先我按照大牛-SDS集团的回答解决了。但是后来我找到了nuget包 Exchange.WebServices.Managed.Api from marklamley. It is the current version 2.2.1.1 of the ews-managed-api GitHub project.