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

时间:2015-03-25 12:47:54

标签: c# exchange-server exchangewebservices ews-managed-api

所以我正在构建一个允许一组用户查看来自某个电子邮件地址的所有电子邮件的应用程序。一切正常。当我想要获取附件时,我遇到的问题就出现了。

我对这个领域相对较新,并使用了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是FileAttachment行时,我会抛出此错误

  

尝试通过方法'Mail.ExchangeEmailService.GetAttachmentStreamFinal(Mail.MailAttachmentDetails)'访问方法'Microsoft.Exchange.WebServices.Data.GetAttachmentResponse.get_Attachment()'失败。

所有内容都正确传递,响应返回成功。

我已经注意到在单步执行时,附件显示为非公开成员。但是,由于这是封装在微软的类中我不确定为什么是这种情况或我能做什么?

3 个答案:

答案 0 :(得分:4)

我只想扩展@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.2 ]

然后只需将它们复制到lib目录(或类似目录)中,然后直接创建对DLL的引用。

信用:http://www.resolvinghere.com/sm/microsoftexchangewebservicesdatagetattachmentresponsegetattachment-failed.shtml

答案 1 :(得分:2)

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

答案 2 :(得分:2)

正如其他已经提到的答案,微软的nuget软件包不是最新的。我也有与OP相同的问题。

首先,我按照Daniel-SDS Group的回答解决了这个问题。但后来我从Exchange.WebServices.Managed.Api找到了nuget包marklamley。它是ews-managed-api GitHub项目的当前版本2.2.1.1。