2011-05-06 33 views
6

Microsoft Exchange Web Services 1.1 SDK kullanıyorum ve yeni posta bildirimi almak için akış bağlantısını kullanarak kullanıyorum. Tüm bildirimleri almak için iyi çalışıyor, ancak abonelikimi bulamaması Exchange'imle ilgili her seferinde bir hata alıyorum. Aşağıda Akış aboneliğim nereye gidiyor?

aboneliğimi ve kullandığım olayları başlatmak için kullanıyorum kodudur.
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.

O istisna kendisi için konuşur ve ben sadece Reconnect() içinde başka bir abonelik oluşturabilir farkındayım. Birinin, aboneliğin nereye gittiğini anlamamda yardımcı olabileceğini umuyorum. Exchange 2010 gibi bir ürünün aboneliğimi yitireceğini düşünemiyorum. Ayrıca, hatayı işaret edemiyorum. Bazen aboneliğimi 10 dakika boyunca aktif tutabilirim ve diğer zamanlarda 2-3 dakika sonra aboneliğimin geçerli olmamasıyla ilgili bir hata alıyorum.

Bunun için Exchange 2010 SP1 kullanıyorum.

cevap

7

Reflektörde kaynağa bakmadan, bir aboneliğin kaldırılabildiği iki yol gibi görünüyor (StreamingSubscriptionConnection'u atmaktan başka, yapmıyor olduğunuzu veya kaldırılan bir abonelik tarafından Kaldır'ı çağırmaktır) ServiceError.ErrorMissedNotificationEvents dışında bir hata kodu ResolveError işleyicide errorEventArgs.Exception bakarak hata denetleyebilirsiniz.Eğer ServiceResponseException örneğidir, bu tür bir döküm ve ErrorCode özelliği olsun.Kullanıcı OnSubscriptionError olayından sonra, abonelik Daha sonra otomatik olarak kaldırılır.

bu neden oluyor izini, fakat onu tamir edemez bile, det olabilir yardımcı olabilecek hata kodu alınıyor Abonelik kaldırıldığında ve bu durumda başka bir abonelikte eşzamansız olarak eklendiğinde ermin.

+0

Önerdiğiniz gibi yaptım ve aldığım hata kodu 'ErrorSubscriptionNotFound'. Neden olduğundan emin değilim çünkü 'gönderici' argümanını incelersem orada bir abonelik olduğunu görebilirim. – Mike

+1

Hata kodu, sunucudan gelen hatadır. Aşağı doğru incelediğinizde ve aboneliğin hala orada olduğunu gördüğünüzde, müşterinizdesiniz. Aboneliği bulamayan bir sunucudur. Tahminimce sunucu bir dakika sonra aboneliği iptal etti, çünkü sadece bir dakikalık bir zaman aşımı verdiniz. Daha uzun bir zaman aşımı deneyin ve sorunun hala devam edip etmediğini görün. Niçin kasıtlı olarak bir dakikalık zaman aşımı kullandın? –

+0

Zaman aşımını bir dakikaya ayarladım çünkü 30 dakikalık bir zaman aşımıyla aynı hatayı alıyordum. Hataları bulmak için 30 dakikalık birkaç set beklemek yerine hataları daha hızlı görmek istedim. Ama şimdi bunu düşünüyorum, her zaman aktif bir aboneliği sürdürmemi sağlamak için savunmaya devam etmeliyim. Sunucunun ne zaman bir hıçkırtıracağını asla bilemezsin. Teşekkür ederim. – Mike

1

Bunu uzun zaman önce istendi biliyorum ama ben hata ulaşım im (olur NEDEN açıklayan şey bulamıyorum) nasıl sonrası düşündüm. Ayrıca bu arada office 2010 sp1 kullanıyor.

Sen Etkin bir aboneliğiniz varsa doğrulamak için göndericiden Sayısı() yöntemini kullanabilirsiniz

;

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 
     } 
    }