【问题标题】:Getting attachments from Exchange Managed API using ASP.NET Core使用 ASP.NET Core 从 Exchange 托管 API 获取附件
【发布时间】:2018-05-25 11:32:46
【问题描述】:

我正在构建一个 Outlook 加载项,该加载项对我拥有的外部 API 进行身份验证。对于我的一个函数,我将附件 ID 列表从加载项发送到 API。然后,我可以使用这些 ID 从 Microsoft 的 Exchange Managed API 获取相应的附件。问题是因为我使用的是 .NET Core,所以推荐的库缺少访问附件所需的必要功能。

这是我试图用来访问主 Microsoft.Exchange.WebServices 库中的附件的一些代码:

ServiceResponseCollection<GetAttachmentResponse> getAttachmentsResponse = service.GetAttachments(attachmentInfo.attachmentIds.ToArray(), null, new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent));

if (getAttachmentsResponse.OverallResult == ServiceResult.Success)
{
    foreach (var attachmentResponse in getAttachmentsResponse)
    {
        // removed logic for simplicity
    }
}

问题是第一行代码会引发错误,除非我在其末尾附加.Result。这是 .NET Core 版本的库中的一些缺陷。当我使用它时,任务永远不会离开Awaiting Action 或类似的状态。

另一个应该为 .NET Core 调整的库是 Microsoft.Exchange.WebServices.NETStandard

这是我发现的一些可以工作的代码:

var getAttachmentsResponse = service.GetAttachments(attachmentInfo.attachmentIds.ToArray(), null, new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent));

foreach (var attachmentResponse in getAttachmentsResponse)
{
    // removed logic for simplicity
}

使用此示例,对象模型不同,响应中甚至没有Overall Result。更不用说,调用会立即失败,并出现关于存在重复键的错误。我可能记得在某处读到此方法仅接受用户名/密码凭据。

是否有任何其他解决方案可以帮助我从我的 API 接收来自 Outlook 电子邮件的附件?我是否遗漏了一些非常明显的东西?

【问题讨论】:

  • 这看起来像一个异步库...为什么不等待调用,这样您就不会得到 Task 结果而是 T ...示例 var getAttachmentResponse = await service .GetAttachment (....);
  • 在前面添加异步并使函数异步(它需要)时,我收到一条错误消息,提示“ServiceResponseCollection”不包含“GetAwaiter”的定义,并且没有扩展方法“GetAwaiter” ' 可以找到接受“ServiceResponseCollection”类型的第一个参数(您是否缺少 using 指令或程序集引用?)

标签: asp.net asp.net-core exchange-server outlook-addin office-js


【解决方案1】:

您还可以使用 Outlook REST Endpoint for messages 和日历来检索附件,这会将所有附件作为数组元素返回,其中包含 JSON 格式的数据

var currentAttachments ;
function getAttachments()

    {

       var options ={
           isRest: true,
           asyncContext: { message: 'Hello World!' }
           };

        Office.context.mailbox.getCallbackTokenAsync(options, getAttachment);


        function getAttachment(asyncResult)

          {
            var token = asyncResult.value;

            var getAttachmentsUrl = Office.context.mailbox.restUrl +
            '/v2.0/me/messages/' + Office.context.mailbox.convertToRestId(Office.context.mailbox.item.itemId, Office.MailboxEnums.RestVersion.v2_0) + '/attachments';



            $.ajax({
            url: getAttachmentsUrl,
            contentType: 'application/json',
            type: 'get',
            headers: { 'Authorization': 'Bearer ' + token }
            }).done(function (item) {

            currentAttachments = item;

            }).fail(function (error) {

            console.log(error);

             });




        }


    }

 // Then we can use Foreach Loop to iterate through these attachments



var outputStringFromRest = "";
                        for (i = 0; i < currentAttachments.value.length; i++) {
                            var _att = currentAttachments.value[i];
                            outputStringFromRest += "<BR>" + i + ". Name: ";
                            outputStringFromRest += _att.Name;
                            outputStringFromRest += "<BR>ID: " + _att.Id;
                            outputStringFromRest += "<BR>contentType: " + _att.ContentType;
                            outputStringFromRest += "<BR>size: " + _att.Size;
                            outputStringFromRest += "<BR>attachmentType: " + "file";
                            outputStringFromRest += "<BR>isInline: " + _att.IsInline;
                        }

【讨论】:

  • 我可以从您的示例中的 Rest API 获取附件。但是,我应该如何处理这里的这些信息?我可以将此信息发送到 API 并以某种方式使用“ContentBytes”在我们的 Blob 存储中实际查看或创建附件吗?
  • 是的,您可以使用 'contentBytes' 这是一个 'base64' 字符串,通过将 'base64' 字符串转换回原始文档来提取附件内容
  • 你知道这样的例子吗?我实际上是在尝试使用 MemoryStream 将这个原始的“contentBytes”字符串上传到 blob 存储中。但是,每当我通过将字符串转换为字节数组将其保存到流中时,附件似乎无效或损坏。
  • 当您将内容字节从客户端发送到服务时,数据可能会损坏。要克服这个问题,而不是从您的加载项进行调用,请按以下格式构造 Url var getAttachmentsUrl = Office.context.mailbox.restUrl + '/v2.0/me/messages/' + Office.context.mailbox.convertToRestId(Office.context.mailbox.item.itemId, Office.MailboxEnums.RestVersion.v2_0) + '/attachments'; 并传递它是您的服务以及 1.5 API REST token,并从您的服务进行 API 调用。这可以避免损坏您的数据。
猜你喜欢
  • 2011-08-04
  • 1970-01-01
  • 2013-03-11
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多