2011-05-06 15 views
6

मैं माइक्रोसॉफ्ट एक्सचेंज वेब सर्विसेज 1.1 एसडीके का उपयोग कर रहा हूं और नई मेल अधिसूचना की सदस्यता लेने के लिए स्ट्रीमिंग कनेक्शन का उपयोग कर रहा हूं। सभी अधिसूचनाएं प्राप्त करने के लिए ठीक काम करते हैं लेकिन मुझे कुछ समय में मेरी एक्सचेंज के बारे में त्रुटियां मिलती हैं, मेरी सदस्यता नहीं मिल पाती है।मेरी स्ट्रीमिंग सदस्यता कहां जा रही है?

नीचे वह कोड है जिसका उपयोग मैं अपनी सदस्यता और उन घटनाओं को शुरू करने के लिए कर रहा हूं जो मैं उपयोग करता हूं।

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() के अंदर एक और सदस्यता बना सकते हैं हूँ। मुझे आशा है कि कोई मुझे समझने में मदद कर सकता है कि सदस्यता कहां जा रही है। मैं कल्पना नहीं कर सकता कि एक्सचेंज 2010 जैसे उत्पाद मेरी सदस्यता खो देंगे। इसके अलावा, मैं त्रुटि को इंगित नहीं कर सकता। कभी-कभी मैं अपनी सदस्यता को 10 मिनट तक सक्रिय रख सकता हूं और दूसरी बार मुझे अपनी सदस्यता के बारे में एक त्रुटि प्राप्त होती है जो 2-3 मिनट के बाद मान्य नहीं होती है।

यह क्या है इसके लिए मैं एक्सचेंज 2010 एसपी 1 का उपयोग कर रहा हूं।

उत्तर

7

परावर्तक में स्रोत को देखने से, ऐसा लगता है कि सदस्यता को हटाया जा सकता है (StreamingSubscriptionConnection का निपटान करने के अलावा, निकालें, जिसे मैं मानता हूं कि आप नहीं कर रहे हैं, या सब्सक्रिप्शन रिटर्निंग द्वारा ServiceError.ErrorMissedNotificationEvents के अलावा एक त्रुटि कोड। आप अपने ResolveError हैंडलर में errorEventArgs.Exception पर देखकर त्रुटि का निरीक्षण कर सकते हैं। यदि यह ServiceResponseException का उदाहरण है, तो इसे उस प्रकार पर डालें और ErrorCode संपत्ति प्राप्त करें। OnSubscriptionError ईवेंट को फायर करने के बाद, सदस्यता है फिर स्वचालित रूप से हटा दिया गया।

त्रुटि कोड प्राप्त करने से आपको यह पता चलने में मदद मिल सकती है कि यह क्यों हो रहा है, लेकिन यदि आप इसे ठीक नहीं कर सकते हैं, तो आप इसे हटा सकते हैं जब सदस्यता को हटा दिया जाएगा और उस मामले में अतुल्यकालिक रूप से एक और सदस्यता में जोड़ दिया जाएगा।

+0

जैसा आपने सुझाव दिया था और मैंने जो त्रुटि कोड प्राप्त किया है वह है 'त्रुटि सदस्यता NotFound'। निश्चित नहीं है क्यों क्योंकि अगर मैं 'प्रेषक' तर्क पर ड्रिल करता हूं तो मैं देख सकता हूं कि वहां एक सदस्यता है। – Mike

+1

त्रुटि कोड सर्वर से आया त्रुटि है। जब आप नीचे ड्रिल करते हैं और देखते हैं कि सदस्यता अभी भी है, तो आप ग्राहक पर हैं। यह वह सर्वर है जो सदस्यता नहीं ढूंढ सकता है। मेरा अनुमान है कि सर्वर ने एक मिनट या उसके बाद सदस्यता को त्याग दिया क्योंकि आपने केवल एक मिनट का टाइमआउट दिया था। लंबे समय तक प्रयास करें और देखें कि समस्या अभी भी होती है या नहीं। आपने जानबूझकर एक मिनट का टाइमआउट क्यों उपयोग किया? –

+0

मैंने टाइमआउट को एक मिनट में सेट किया क्योंकि मुझे 30 मिनट के टाइमआउट के साथ एक ही त्रुटि मिल रही थी। त्रुटि खोजने के लिए 30 मिनट के कई सेट प्रतीक्षा करने के बजाय मैं त्रुटियों को तेज़ी से देखना चाहता था। लेकिन अब जब मैं इसके बारे में सोचता हूं तो मुझे यह सुनिश्चित करने में रक्षात्मक रूप से कोडिंग करना चाहिए कि मैं हर समय सक्रिय सदस्यता रखता हूं। आप कभी नहीं जानते कि सर्वर के पास हिचकी होगी। धन्यवाद। – Mike

1

मुझे पता है कि यह बहुत समय पहले पूछा गया था, लेकिन मैंने सोचा कि मैं पोस्ट करूंगा कि मैं त्रुटि के आसपास कैसे हो रहा हूं (ऐसा कुछ भी नहीं मिलता जो बताता है कि ऐसा क्यों होता है)। रास्ते में कार्यालय 2010 sp1 का भी उपयोग कर रहे हैं।

आप प्रेषक से गणना() विधि का उपयोग यह सत्यापित करने के लिए कर सकते हैं कि आपके पास सक्रिय सदस्यता है या नहीं;

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 
     } 
    } 
संबंधित मुद्दे