如何触发订阅错误以测试 exchange web 服务的恢复

How do I trigger a subscription error to test recovery on exchange web service

我的应用程序将 EWS API 与流式订阅一起使用,一切正常,这对我来说是个问题,因为我无法为 OnSubscriptionError 事件执行恢复代码。

这是我用来订阅流媒体通知的代码

private void SetStreamingNotifications(List<FolderId> folder_ids)
{
    streaming_subscriptions_connection = new StreamingSubscriptionConnection(exchange_service, 30);

    streaming_subscriptions_connection.OnDisconnect += OnDisconnect;
    streaming_subscriptions_connection.OnSubscriptionError += OnSubscriptionError;
    streaming_subscriptions_connection.OnNotificationEvent += OnNotificationEvent;

    foreach (var folder_id in folder_ids)
    {
        StreamingSubscription sub = exchange_service.SubscribeToStreamingNotifications(
            new[] { folder_id },
            EventType.Created,
            EventType.Modified,
            EventType.Deleted,
            EventType.Moved,
            EventType.Copied
        );

        streaming_subscriptions_connection.AddSubscription(sub);
    }

    streaming_subscriptions_connection.Open();
}
private void OnSubscriptionError(object sender, SubscriptionErrorEventArgs args)
{
    /* What exceptions can i expect to find in "args.Exception" */
    /* Can the streaming subscription be recovered or do i need to create a new one? */
}

所以我的问题是如何触发订阅错误,以便确保我的代码可以在可能的情况下恢复并在不可能的情况下记录/提醒?

编辑
在 @kat0r 的评论之后,我觉得我应该添加:
我目前正在针对 Exchange 2013 进行测试,还打算针对 Exchange 2010 SP1 进行测试。

您可以做的几件事是

节流将限制您可以创建的最大订阅数,因此如果您继续创建新订阅,一旦超过 20 个,您应该会从服务器收到节流响应。

另一件事是,如果您使用 SubscriptionId 并使用不同的流程来取消订阅,其他代码应该得到一个 Subscription not found。

您还想测试底层网络问题,例如断开连接、dns(如果您有开发环境)看看当您弹回 Exchange Server 时会发生什么等。

干杯 格伦

我与 Microsoft 进行了通话,以了解是否可行。简短的回答是不,你不能触发 OnSubscriptionError 事件。

以下是 MS 的电子邮件回复:


在回答您的问题时,我认为您没有办法触发 OnSubscriptionError 事件。如果确实遇到此事件,应采取的正确操作是尝试重新创建遇到错误的订阅。我会查看是否可以找到有关此的任何进一步信息,但事件很少生成,并且仅在 Exchange 服务器上遇到意外错误时才会生成(这就是它可能无法触发它的原因)。
我突然想到 EWS Managed API 已经开源,现在可以在 Github 上使用:https://github.com/officedev/ews-managed-api

基于此,我们可以确切地看到导致 OnSubscriptionError 事件被引发的原因——据我所知,这只发生在 IssueSubscriptionFailures 和 IssueGeneralFailure 方法中,这两个方法都可以在 StreamingSubscriptionConnection.cs.任何不是 ServiceError.ErrorMissedNotificationEvents 且与订阅相关的错误都将导致引发此事件(并删除订阅)。从响应 Xml 中读取错误。当然,这并不能真正回答您关于如何触发事件的问题,因为这涉及到导致 Exchange 产生这样的错误(恐怕没有这方面的信息)。可以在测试环境中将一些 Xml(表示错误)注入到响应中——理论上,您可以使用 Fiddler 来执行此操作(因为它允许您操纵 requests/responses ).