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

C# 使用EWS和C获取附件失败,ServiceMethodException,c#,exchange-server,exchangewebservices,ews-managed-api,C#,Exchange Server,Exchangewebservices,Ews Managed Api,因此,我目前正在构建一个应用程序,允许一组用户查看来自某个电子邮件地址的所有电子邮件。这一切都正常工作。我遇到的问题是当我试图获取附件时 我对这方面比较陌生,使用了Microsoft的示例,并将其与下面的代码进行了比较: protected internal override Stream GetAttachmentStreamFinal(MailAttachmentDetails attachment) { var response = m_service.Ge

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

我对这方面比较陌生,使用了Microsoft的示例,并将其与下面的代码进行了比较:

    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;
    }
受保护的内部重写流GetAttachmentStreamFinal(MailAttachmentDetails附件)
{
var response=m_service.GetAttachments(新[]{attachment.Id},BodyType.Text,Enumerable.Empty());
if(response.OverallResult!=servicesult.Success)
{
如果(response.Count>0)
{
var ex=新邮件异常(响应[0]。错误消息);
添加(响应[0]。错误代码,响应[0]。错误消息);
foreach(在响应[0]中设置了变量。错误详细信息)
{
ex.Data.Add(ed.Key,ed.Value);
}
掷骰子;
}
抛出新邮件异常(“从邮件服务获取附件时出错”);
}
foreach(var附件响应)
{
if(attachmentResponse.Attachment为文件附件)
{
var fa=attachmentResponse.Attachment作为文件附件;
var cs=新的内存流(fa.Content);
fa.荷载(cs);
cs.Seek(0,SeekOrigin.Begin);
返回cs;
}
}
返回null;
}
正如您所看到的,这两组代码非常相似。但是,当我单步执行并到达attachmentResponse.Attachment是FileAttachment行时,我会抛出此错误

通过方法“Mail.ExchangeMailService.GetAttachmentStreamFinal(Mail.MailAttachmentDetails)”尝试访问方法“Microsoft.Exchange.WebServices.Data.GetAttachmentResponse.get_Attachment()”失败

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


我注意到,在我的代码中,附件显示为非公共成员。但是由于这是封装在Microsofts类中的,我不确定为什么会这样,或者我能做什么?

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

我只想在@Jason Johnstons answer上展开

出于某种原因,NuGet中的EWS版本不正确。它会抛出您正在经历的错误

解决方法是通过删除对NuGet包的引用

Uninstall-Package Microsoft.Exchange.WebServices
然后在此处下载并运行MSI文件

这将把您需要的DLL安装到的默认位置

[ C:\Program Files\Microsoft\Exchange\Web Services\2.2 ]
然后简单地将它们复制到lib目录(或类似目录)中,并直接创建对DLL的引用


信用证:

正如前面提到的其他答案,微软的nuget软件包不是最新的。我也有和OP一样的问题


首先,我按照Daniel-SDS小组的答案解决了这个问题。但后来我从中找到了nuget软件包。这是GitHub项目的当前版本2.2.1.1。

您是通过邮件应用程序(在Outlook中运行)执行此操作的吗?您链接的示例用于邮件应用程序,比普通EWS应用程序需要的更复杂。不,这在Web应用程序中运行。当客户机请求文件时,我也遇到了同样的问题,虽然我使用了最新版本的汇编表单nuget,但当我从中安装后引用汇编时,就会用到这个函数。你有没有找到解决这个问题的稳定方法?我用的是我从网上下载的2.2版,对吗?属性显示版本15.0.0.0和运行时版本2.0.50727您最终是正确的。我引用了它,但在我的构建中它仍然使用旧版本14。请确保在GAC中注册了正确的版本。今天可以帮我节省几个小时…MS现在应该已经在NuGet提要中修复了这个问题!从2017年4月起,我仍然需要这样做。这确实帮助了我实现了这项计划。当我在VisualStudio中运行代码时,我能够按语法下载附件。但是,当我在AWS主机中部署相同的代码时,它给出了我们之前遇到的错误——“尝试方法”Mail.ExchangeMailService.GetAttachmentStreamFinal(Mail.MailAttachmentDetails)”访问方法“Microsoft.Exchange.WebServices.Data.GetAttachmentResponse.get_Attachment()”失败。“@BalajiBirajdar我确实在Azure中托管我的应用程序,并且没有AWS方面的经验。但是本地运行和云中运行应该没有区别。我从来没有遇到过这样的问题。