我的流媒体订阅去哪了?

6
我正在使用Microsoft Exchange Web Services 1.1 SDK,并使用流连接订阅新邮件通知。接收通知的功能正常,但偶尔会收到关于无法找到我的订阅的Exchange错误。
下面是我用来初始化订阅和使用事件的代码。
public void Subscribe()
{
    var locateMailbox = new Mailbox
                            {
                                Address = "myemail"
                            };
    var folderId = new FolderId(WellKnownFolderName.Inbox, locateMailbox);
    var foldersToWatch = new[] {folderId};
    StreamingSubscription streamingSubscription =
        _exchangeService.SubscribeToStreamingNotifications(foldersToWatch, EventType.NewMail);
    // Timeout is set at 1 minute intentionally
    var streamingConnection = new StreamingSubscriptionConnection(_exchangeService, 1);

    streamingConnection.AddSubscription(streamingSubscription);

    streamingConnection.OnSubscriptionError += ResolveError;
    streamingConnection.OnDisconnect += Reconnect;

    streamingConnection.Open();
}

public void Reconnect(object sender, SubscriptionErrorEventArgs disconnectEventArgs)
{
    if (!((StreamingSubscriptionConnection)sender).IsOpen)
        ((StreamingSubscriptionConnection)sender).Open();
}

public void ResolveError(object sender, SubscriptionErrorEventArgs errorEventArgs)
{
    var streamingSubscriptionConnection =
        (StreamingSubscriptionConnection) sender;
    if (!streamingSubscriptionConnection.IsOpen)
        streamingSubscriptionConnection.Open();
}

ServiceLocalException - 必须在打开连接之前向此连接添加至少一个订阅。

这个异常已经说明了问题,我知道可以在Reconnect()中简单地创建另一个订阅。但我希望有人能帮我理解这个订阅到底去了哪里。我无法想象像Exchange 2010这样的产品会轻易丢失我的订阅。并且,我无法确定错误的具体位置。有时我的订阅可以保持10分钟,而有时候2-3分钟后我就收到一个关于我的订阅无效的错误。

值得一提的是,我正在使用Exchange 2010 SP1。

2个回答

7
从反编译器中查看源代码,似乎除了处理StreamingSubscriptionConnection的Dispose之外,只有通过调用Remove或者订阅返回其他错误代码(而不是ServiceError.ErrorMissedNotificationEvents)才能删除订阅。您可以在ResolveError处理程序中查看errorEventArgs.Exception以检查错误。如果它是ServiceResponseException的实例,请将其转换为该类型并获取ErrorCode属性。在触发OnSubscriptionError事件后,订阅会自动被删除。
获得错误代码可能有助于您追踪此问题的原因,但即使您无法解决它,也可以确定何时会删除订阅,并在这种情况下异步添加另一个订阅。

我按照你的建议去做了,但是我得到的错误代码是“ErrorSubscriptionNotFound”。不确定为什么,因为如果我深入挖掘sender参数,我可以看到里面有一个订阅。 - Mike
1
错误代码是来自服务器的错误。当您深入了解并发现订阅仍然存在时,您就在客户端上了。无法找到订阅的是服务器的问题。我猜测是因为您只给了一分钟的超时时间,所以服务器在一分钟左右后丢弃了该订阅。尝试更长的超时时间,看看问题是否仍然存在。为什么您故意使用了一分钟的超时时间呢? - Mike Dour
我将超时时间设置为一分钟,因为使用30分钟的超时时间仍然会出现相同的错误。为了更快地发现错误,我不想等待几组30分钟。但现在我想起来了,我应该始终以防御性编码方式确保我随时保持活动订阅。你永远不知道服务器何时会出现问题。谢谢。 - Mike
看起来我必须等待6个小时才能奖励悬赏。 - Mike

2

我知道这个问题很久以前就被问到了,但我想发表一下我是如何解决这个错误的(找不到任何解释为什么会出现这个错误)。顺便说一下,我使用的是Office 2010 SP1。

您可以使用发送方的Count()方法来验证是否有活动订阅;

private static void onDisconnect(object sender, SubscriptionErrorEventArgs args)
    {

        StreamingSubscriptionConnection renew = (StreamingSubscriptionConnection)sender;
        if(renew.CurrentSubscriptions.Count() > 0){ //if subscription exists reopen as normal
            renew.Open(); 
        }
        else
        {
            //recreate the whole connection
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接