2011-05-06 124 views
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 - You must add at least one subscription to this connection before it can be opened.

这个例外是有目共睹的,我知道,我可以简单地创建的Reconnect()内其他订阅。我希望有人能帮我理解订阅的去向。我无法想象像Exchange 2010这样的产品会简单地失去我的订阅。另外,我不能指出错误。有时我可以保持我的订阅活动时间为10分钟,而其他时间我收到有关我的订阅在2-3分钟后无效的错误。

对于我使用Exchange 2010 SP1的价值。

回答

7

从查看Reflector中的源代码,它看起来像订阅可以被删除的唯一两种方式(除去配置StreamingSubscriptionConnection,通过调用Remove,我假设你没有做,或通过订阅返回除ServiceError.ErrorMissedNotificationEvents以外的错误代码您可以通过查看ResolveError处理程序中的errorEventArgs.Exception来检查错误,如果它是ServiceResponseException的实例,则将其转换为该类型并获取ErrorCode属性。然后自动删除

获取错误代码可能会帮助您找出发生这种情况的原因,但即使您无法修复它,您也可以呃,当订阅将被删除,并在这种情况下异步添加另一个订阅。

+0

我照你的建议做了,我得到的错误代码是'ErrorSubscriptionNotFound'。不知道为什么,因为如果我深入了解'发送者'参数,我可以看到那里有订阅。 – Mike 2011-05-09 11:56:17

+1

错误代码是来自服务器的错误。当您深入查看订阅仍在时,您就在客户端上。它是无法找到订阅的服务器。我的猜测是服务器在一分钟左右就放弃了订阅,因为你只给了一分钟的超时时间。尝试更长的超时时间并查看问题是否仍然存在。为什么你故意使用一分钟超时? – 2011-05-09 13:20:29

+0

我将超时设置为一分钟,因为我收到了30分钟超时的相同错误。与其等待几组30分钟找到错误,我想更快地查看错误。但现在我想到了这一点,我仍然应该在防守方面编码,以确保我始终保持积极的订阅。你永远不知道服务器何时会发生呃逆。谢谢。 – Mike 2011-05-09 13:24:47

1

我知道这是很久以前问的,但我想我会发布如何解决错误(无法找到任何解释为什么发生)。顺便也使用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 
     } 
    }