C# 我的流媒体订阅要去哪里?

C# 我的流媒体订阅要去哪里?,c#,exchangewebservices,exchange-server-2010,C#,Exchangewebservices,Exchange Server 2010,我正在使用Microsoft Exchange Web Services 1.1 SDK并使用流连接订阅新邮件通知。所有这些都可以很好地接收通知,但我每隔一段时间就会收到关于我的Exchange无法找到我的订阅的错误 下面是我用来初始化订阅和使用的事件的代码 public void Subscribe() { var locateMailbox = new Mailbox {

我正在使用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。

从Reflector中的源代码来看,似乎只有两种方法可以删除订阅(除了处理
StreamingSubscriptionConnection
,还可以通过调用Remove(我假设您没有这样做),或者通过订阅返回除
ServiceError.ErrorMissedNotificationEvents
以外的错误代码。您可以通过查看
ResolveError中的
errorEventArgs.Exception
来检查错误e> 处理程序。如果它是
ServiceResponseException
的实例,则将其强制转换为该类型并获取
ErrorCode
属性。在触发
OnSubscriptionError
事件后,订阅将自动删除


获取错误代码可能有助于您追踪发生这种情况的原因,但即使您无法修复它,您也可以确定订阅何时将被删除,并在这种情况下异步添加另一个订阅。

我知道很久以前就有人问过这一问题,但我想我会发布我如何避开错误的帖子(找不到任何解释它发生的原因的东西)。顺便说一下,也使用Office2010SP1

您可以使用发件人的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
        }
    }

我按照你的建议做了,我得到的错误代码是
ErrorSubscriptionNotFound
。我不知道为什么,因为如果我深入查看
sender
参数,我可以看到其中有一个订阅。错误代码是来自服务器的错误。当你深入查看并看到订阅仍然存在时,你就在cl上了客户端。是服务器找不到订阅。我猜服务器在大约一分钟后放弃了订阅,因为您只给了一分钟的超时时间。请尝试更长的超时时间,看看问题是否仍然存在。您为什么故意使用一分钟的超时时间?我将超时时间设置为一分钟,因为我得到了30分钟超时时出现同样的错误。我不想等待几组30分钟来查找错误,而是希望更快地看到错误。但现在我考虑到了这一点,我仍然应该进行防御性编码,以确保我始终保持活动订阅。你永远不知道服务器何时会出现故障。谢谢。看起来我必须等待6小时在奖励赏金之前。别担心。很高兴我能帮上忙。