【问题标题】:AccessDenied with Item.bind() from subscribeToStreamingNotifications来自 subscribeToStreamingNotifications 的带有 Item.bind() 的 AccessDenied
【发布时间】:2019-10-15 22:22:38
【问题描述】:

我们正在通过以下方法使用 MS Exchange 2016 订阅流式通知:

 service.subscribeToStreamingNotificationsOnAllFolders(EventType.Copied,EventType.Created, EventType.Deleted, EventType.Modified, EventType.Moved, EventType.NewMail);

                switch (itemEvent.getEventType()) {
                    case Deleted:
                        delete(mailbox, itemEvent.getItemId());
                        break;
                    case Moved:
                        try {
                            delete(mailbox, itemIdNoChangeKey(itemEvent.getOldItemId()));
                        } finally {
                            create(mailbox, Item.bind(service, itemIdNoChangeKey(itemEvent.getItemId())));
                        }
                        break;
                    case Modified:
                        update(mailbox, Item.bind(service, itemIdNoChangeKey(itemEvent.getItemId()), itemProp()));
                        break;
                    case Copied:
                    case Created:
                        create(mailbox, Item.bind(service, itemIdNoChangeKey(itemEvent.getItemId()), itemProp()));
                        break;
                }

有时上面的调用会成功,但通常情况下,Items.bind() 会失败:

“访问被拒绝。检查凭据并重试。,该过程未能获得正确的属性。,errorCode='ErrorAccessDenied'”

“在商店中找不到指定的对象。,进程未能获得正确的属性。,errorCode='ErrorItemNotFound'”

尽管如此

  • 凭证有效,可以成功调用service.findFolders(WellKnownFolderName.MsgFolderRoot, folderView);
  • 我们正在使用 Exchange 模拟。已为所有邮箱分配了模拟权限。
  • 锚邮箱设置:service.getHttpHeaders().put("X-AnchorMailbox",mailbox);
  • X-PreferServerAffinity 已设置:service.getHttpHeaders().put("X-PreferServerAffinity", "true");

谁能告诉我们为什么我们会收到 ErrorAccessDenied 和 ErrorItemNotFound 错误?是否与 Exchange 系统相关邮件或文件夹的处理有关?我们如何处理这些项目,或者如果我们不能,如何跳过它们而不会对 Exchange 服务器造成不必要的负载?

【问题讨论】:

    标签: java exchange-server exchangewebservices


    【解决方案1】:

    就我而言,我的代码冒充了错误的邮箱。事实证明,我需要按如下方式维护地图:

     private Map<StreamingSubscription, String> reverseSubscriptions = Collections.synchronizedMap(new HashMap<>());
    

    然后在notificationEventDelegate(..)方法中...

    打电话

    String mailbox = reverseSubscriptions.get(args.getSubscription());
    

    处理物品事件时...

     private void processItemEvent(ExchangeService service, String mailbox, ItemEvent itemEvent) throws Exception {
            synchronized(service) {
                service.setImpersonatedUserId(impersonateAccount(mailbox));
                service.getHttpHeaders().put("X-AnchorMailbox", mailbox);
                service.getHttpHeaders().put("X-PreferServerAffinity", "true");
                    try {
                       ...
                    } catch (Exception ie) {
                       ...
                    }
                }
          }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多