2011-05-06 26 views
6

Estoy usando el SDK de servicios web de Microsoft Exchange 1.1 y el uso de la conexión de transmisión para suscribirme a notificaciones de correo nuevo. Todo funciona bien para recibir las notificaciones, pero recibo errores de vez en cuando sobre que mi Exchange no puede encontrar mi suscripción.¿A dónde va mi suscripción de transmisión?

A continuación se muestra el código que estoy utilizando para inicializar mi suscripción y los eventos que uso.

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.

Esa excepción habla por sí mismo y estoy consciente de que simplemente puedo crear otra suscripción interior de Reconnect(). Espero que alguien me ayude a comprender a dónde va la suscripción. No puedo imaginarme que un producto como Exchange 2010 simplemente pierda mi suscripción. Además, no puedo señalar el error. A veces puedo mantener mi suscripción activa durante 10 minutos y otras veces recibo un error acerca de que mi suscripción no es válida después de 2 o 3 minutos.

Por lo que vale, estoy usando Exchange 2010 SP1.

Respuesta

7

Al consultar la fuente en Reflector, parece que las dos únicas formas en que se puede eliminar una suscripción (aparte de eliminar el StreamingSubscriptionConnection, es llamar a Eliminar, que supongo que no está haciendo, o devolver una suscripción un código de error que no sea ServiceError.ErrorMissedNotificationEvents. Puede inspeccionar el error mirando errorEventArgs.Exception en su controlador ResolveError. Si es una instancia de ServiceResponseException, vuélvala a ese tipo y obtenga la propiedad ErrorCode. Después de desconectar el evento OnSubscriptionError, la suscripción es luego se eliminó automáticamente.

Obtener el código de error puede ayudarlo a rastrear por qué sucede esto, pero incluso si no puede solucionarlo, puede det. armin cuando se eliminará la suscripción y agregar asincrónicamente otra suscripción en ese caso.

+0

Hice como usted sugirió y el código de error que consigo es 'ErrorSubscriptionNotFound'. No estoy seguro de por qué porque si profundizo en el argumento 'remitente' puedo ver que hay una suscripción allí. – Mike

+1

El código de error es el error que vino del servidor. Cuando desgloses y ves que la suscripción todavía está allí, estás en el cliente. Es el servidor que no puede encontrar la suscripción. Supongo que el servidor descartó la suscripción después de un minuto aproximadamente porque solo le dio un tiempo de espera de un minuto. Intente un tiempo de espera más largo y vea si el problema todavía ocurre. ¿Por qué intencionalmente usó un tiempo de espera de un minuto de todos modos? –

+0

Establecí el tiempo de espera en un minuto porque recibía el mismo error con un tiempo de espera de 30 minutos. En lugar de esperar varios conjuntos de 30 minutos para encontrar el error, quería ver los errores más rápido. Pero ahora que lo pienso, debería seguir codificando a la defensiva para asegurarme de mantener una suscripción activa en todo momento. Nunca se sabe cuando el servidor tendrá un tropiezo. Gracias. – Mike

1

Sé que esto fue preguntado hace mucho tiempo, pero pensé que publicaría cómo estoy solucionando el error (no puedo encontrar nada que explique POR QUÉ sucede). También usando office 2010 sp1 por cierto.

Puede usar el método Count() del remitente para verificar si tiene una suscripción activa;

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