Condividi tramite


bus di servizio eccezioni di messaggistica (.NET)

La libreria client .NET bus di servizio rileva eccezioni quando si verifica un errore in un'operazione del servizio o in un client. Quando possibile, i tipi di eccezione .NET standard vengono usati per trasmettere informazioni sugli errori. Per scenari specifici di bus di servizio, viene generata un'eccezione ServiceBusException.

I client bus di servizio riprovano automaticamente ad eccezioni considerate temporanee, seguendo le opzioni di ripetizione dei tentativi configurate. Quando viene rilevata un'eccezione all'applicazione, tutti i tentativi sono stati applicati in modo non riuscito oppure l'eccezione è stata considerata non transiente. Altre informazioni sulla configurazione delle opzioni di ripetizione dei tentativi sono disponibili nell'esempio Personalizzazione delle opzioni di ripetizione dei tentativi .

ServiceBusException

L'eccezione include alcune informazioni contestuali che consentono di comprendere il contesto dell'errore e la relativa gravità relativa.

  • EntityPath: identifica l'entità bus di servizio da cui si è verificata l'eccezione, se disponibile.
  • IsTransient : indica se l'eccezione è considerata recuperabile o meno. Nel caso in cui fosse considerato temporaneo, bus di servizio di Azure già applicato i criteri di ripetizione appropriati e tutti i tentativi hanno avuto esito negativo.
  • Message : fornisce una descrizione dell'errore che si è verificato e del contesto pertinente.
  • StackTrace : rappresenta i fotogrammi immediati dello stack di chiamate, evidenziando la posizione nel codice in cui si è verificato l'errore.
  • InnerException : quando un'eccezione è il risultato di un'operazione del servizio, è spesso un'istanza Microsoft.Azure.Amqp.AmqpException che descrive l'errore, seguendo la specifica OASIS Advanced Message Queuing Protocol (AMQP) 1.0.
  • Reason : fornisce un set di motivi noti per l'errore che consentono di classificare e chiarire la causa radice. Questi valori sono progettati per consentire l'applicazione del filtro delle eccezioni e altre logiche in cui l'ispezione del testo di un messaggio di eccezione non sarebbe ideale. Alcuni motivi di errore chiave sono:
    • ServiceTimeout: indica che il servizio bus di servizio non ha risposto a una richiesta di operazione entro il periodo di tempo previsto. Potrebbe essere dovuto a un problema di rete temporaneo o a un problema del servizio. Il servizio bus di servizio potrebbe aver completato o meno la richiesta. Lo stato non è noto. Nel contesto della sessione disponibile successiva, questa eccezione indica che nell'entità non sono disponibili sessioni sbloccate. Questi errori sono errori temporanei che vengono ritentati automaticamente.

    • QuotaExceeded: indica in genere che sono presenti troppe operazioni di ricezione attive per una singola entità. Per evitare questo errore, ridurre il numero di potenziali ricezione simultanee. È possibile usare le ricevute batch per tentare di ricevere più messaggi per ogni richiesta di ricezione. Per altre informazioni, vedere bus di servizio quote.

    • MessageSizeExceeded: indica che la dimensione del messaggio ha superato la dimensione massima del messaggio. Le dimensioni del messaggio includono il corpo del messaggio e i metadati associati. L'approccio migliore per risolvere questo errore consiste nel ridurre il numero di messaggi inviati in un batch o le dimensioni del corpo incluso nel messaggio. Poiché i limiti delle dimensioni sono soggetti a modifiche, vedere bus di servizio quote per specifiche.

    • MessageLockLost: indica che il blocco sul messaggio viene perso. I chiamanti devono tentare di ricevere ed elaborare di nuovo il messaggio. Questa eccezione si applica solo alle entità che non usano sessioni. Questo errore si verifica se l'elaborazione richiede più tempo della durata del blocco e il blocco del messaggio non viene rinnovato. Questo errore può verificarsi anche quando il collegamento viene scollegato a causa di un problema di rete temporaneo o quando il collegamento è inattiva per 10 minuti.

      Il servizio bus di servizio usa il protocollo AMQP con stato. A causa della natura del protocollo, se il collegamento che connette il client e il servizio è scollegato dopo la ricezione di un messaggio, ma prima che il messaggio venga definito, il messaggio non può essere definito alla riconnessione del collegamento. I collegamenti possono essere scollegati a causa di un errore di rete temporaneo a breve termine, di un'interruzione della rete o a causa del timeout di inattività imposto dal servizio di 10 minuti. La riconnessione del collegamento viene eseguita automaticamente come parte di qualsiasi operazione che richiede il collegamento, ovvero la risoluzione o la ricezione di messaggi. A causa di questo comportamento, è possibile riscontrare ServiceBusException Reason o MessageLockLost SessionLockLost anche se l'ora di scadenza del blocco non è ancora passata.

    • SessionLockLost: indica che il blocco della sessione è scaduto. I chiamanti devono tentare di accettare di nuovo la sessione. Questa eccezione si applica solo alle entità abilitate per la sessione. Questo errore si verifica se l'elaborazione richiede più tempo della durata del blocco e il blocco della sessione non viene rinnovato. Questo errore può verificarsi anche quando il collegamento viene scollegato a causa di un problema di rete temporaneo o quando il collegamento è inattiva per 10 minuti. Il servizio bus di servizio usa il protocollo AMQP con stato. A causa della natura del protocollo, se il collegamento che connette il client e il servizio è scollegato dopo la ricezione di un messaggio, ma prima che il messaggio venga definito, il messaggio non può essere definito alla riconnessione del collegamento. I collegamenti possono essere scollegati a causa di un errore di rete temporaneo a breve termine, di un'interruzione della rete o a causa del timeout di inattività imposto dal servizio di 10 minuti. La riconnessione del collegamento viene eseguita automaticamente come parte di qualsiasi operazione che richiede il collegamento, ovvero la risoluzione o la ricezione di messaggi. A causa di questo comportamento, è possibile riscontrare ServiceBusException Reason o MessageLockLost SessionLockLost anche se la scadenza del blocco non è ancora passata.

    • MessageNotFound: questo errore si verifica quando si tenta di ricevere un messaggio posticipato in base al numero di sequenza per un messaggio che non esiste nell'entità o è attualmente bloccato.

    • SessionCannotBeLocked: indica che la sessione richiesta non può essere bloccata perché il blocco è già mantenuto altrove. Una volta scaduto il blocco, la sessione può essere accettata.

    • GeneralError: indica che il servizio bus di servizio ha rilevato un errore durante l'elaborazione della richiesta. L'aggiornamento e il riavvio del servizio spesso causano questo errore. Questi errori sono errori temporanei che vengono ritentati automaticamente.

    • ServiceCommunicationProblem: indica che si è verificato un errore durante la comunicazione con il servizio. Il problema potrebbe derivare da un problema di rete temporaneo o da un problema di servizio. Questi errori sono errori temporanei che verranno ritentati automaticamente.

    • ServiceBusy: indica che il servizio ha limitato la richiesta. I dettagli che descrivono cosa può causare la limitazione di una richiesta e come evitare la limitazione sono disponibili qui. Le richieste limitate vengono ritentate, ma la libreria client applica automaticamente un back-off di 10 secondi prima di tentare altre richieste usando lo stesso ServiceBusClient (o qualsiasi sottotipo creato da tale client). Può causare problemi se la durata del blocco dell'entità è inferiore a 10 secondi, perché è probabile che i blocchi di messaggio o sessione vadano persi per eventuali messaggi non bloccati o sessioni bloccate. Poiché le richieste limitate vengono ritentate correttamente, le eccezioni generate verrebbero registrate come avvisi anziché errori. L'evento di origine evento a livello di avviso specifico è 43 (RunOperation ha rilevato un'eccezione e si verifica un nuovo tentativo).

    • MessagingEntityAlreadyExists: indica che esiste un'entità con lo stesso nome nello stesso spazio dei nomi.

    • MessagingEntityDisabled: l'entità di messaggistica è disabilitata. Abilitare di nuovo l'entità usando il portale.

    • MessagingEntityNotFound: bus di servizio servizio non riesce a trovare una risorsa bus di servizio.

Gestire ServiceBusException - Esempio

Ecco un esempio di come gestire un ServiceBusException oggetto e filtrare in base a Reason.

try
{
    // Receive messages using the receiver client
}
catch (ServiceBusException ex) when
    (ex.Reason == ServiceBusFailureReason.ServiceTimeout)
{
    // Take action based on a service time out
}

Altre eccezioni comuni

  • ArgumentException: il client genera questa eccezione derivando da ArgumentException quando un parametro fornito durante l'interazione con il client non è valido. Le informazioni sul parametro specifico e sulla natura del problema sono disponibili in Message.
  • InvalidOperationException: si verifica quando si tenta di eseguire un'operazione non valida per la configurazione corrente. Questa eccezione si verifica in genere quando un client non è stato configurato per supportare l'operazione. Spesso, può essere mitigato modificando le opzioni passate al client.
  • NotSupportedException: si verifica quando un'operazione richiesta è valida per il client, ma non è supportata dallo stato corrente. Le informazioni sullo scenario sono disponibili in Message.
  • AggregateException: si verifica quando un'operazione potrebbe riscontrare più eccezioni e le sta visualizzando come singolo errore. Questa eccezione viene in genere rilevata quando si avvia o arresta il processore di bus di servizio o bus di servizio processore di sessione.

Motivo: QuotaExceeded

ServiceBusException con motivo impostato su QuotaExceeded indica che è stata superata una quota per un'entità specifica.

Nota

Per bus di servizio quote, vedere Quote.

Code e argomenti

Per le code e gli argomenti, è spesso la dimensione della coda. La proprietà del messaggio di errore contiene altri dettagli, come nell'esempio seguente:

Message: The maximum entity size has been reached or exceeded for Topic: 'xxx-xxx-xxx'. 
    Size of entity in bytes:1073742326, Max entity size in bytes:
1073741824..TrackingId:xxxxxxxxxxxxxxxxxxxxxxxxxx, TimeStamp:3/15/2013 7:50:18 AM

Il messaggio indica che l'argomento ha superato il limite di dimensioni, in questo caso 1 GB (limite di dimensioni predefinito).

Namespaces (Spazi dei nomi)

Per gli spazi dei nomi, l'eccezione QuotaExceeded può indicare che un'applicazione ha superato il numero massimo di connessioni a uno spazio dei nomi. Ad esempio:

<tracking-id-guid>_G12 ---> 
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: 
ConnectionsQuotaExceeded for namespace xxx.

Cause comuni

Esistono due cause comuni per questo errore: la coda dei messaggi non recapitabili e i ricevitori di messaggi non funzionali.

  • Coda dei messaggi non recapitabili: un lettore non riesce a completare i messaggi e questi vengono restituiti alla coda o all'argomento alla scadenza del blocco. Può verificarsi se il lettore rileva un'eccezione che impedisce il completamento del messaggio. Dopo che un messaggio è stato letto 10 volte, passa alla coda dei messaggi non recapitabili per impostazione predefinita. La proprietà MaxDeliveryCount controlla questo comportamento, che ha un valore predefinito pari a 10. Man mano che i messaggi si accumulano nella coda dei messaggi non recapitabili, occupano spazio.

    Per risolvere il problema, leggere e completare i messaggi nella coda dei messaggi non recapitabili, come si farebbe per qualsiasi altra coda.

  • Interruzione da parte del destinatario. Un ricevitore ha smesso di ricevere messaggi da una coda o una sottoscrizione. Il modo per identificare il problema consiste nell'esaminare il numero di messaggi attivi. Se il numero di messaggi attivi è elevato o in crescita, i messaggi non vengono letti più velocemente durante la scrittura.

Motivo: MessageLockLost

Causa

ServiceBusException con motivo impostato su MessageLockLost indica che un messaggio viene ricevuto utilizzando la modalità di ricezione PeekLock e il blocco mantenuto dal client scade sul lato servizio.

Il blocco su un messaggio potrebbe scadere a causa di diversi motivi:

  • Il timer di blocco è scaduto prima del rinnovo da parte dell'applicazione client.
  • L'applicazione client ha acquisito il blocco, lo ha salvato in un archivio permanente e quindi riavviato. Dopo il riavvio, l'applicazione client ha esaminato i messaggi in corso e ha tentato di completare i messaggi.

È anche possibile ricevere questa eccezione negli scenari seguenti:

  • Aggiornamento del servizio
  • Aggiornamento del sistema operativo
  • Modifica delle proprietà nell'entità (coda, argomento, sottoscrizione) mantenendo il blocco.

Risoluzione

Quando un'applicazione client riceve MessageLockLostException, non può più elaborare il messaggio. L'applicazione client può facoltativamente prendere in considerazione la registrazione dell'eccezione per l'analisi, ma il client deve eliminare il messaggio.

Poiché il blocco sul messaggio è scaduto, torna alla coda (o sottoscrizione) e può essere elaborato dall'applicazione client successiva che chiama riceve.

Se maxDeliveryCount viene superato, il messaggio potrebbe essere spostato in DeadLetterQueue.

Motivo: SessionLockLost

Causa

ServiceBusException con motivo impostato su MessageLockLost viene generato quando viene accettata una sessione e il blocco mantenuto dal client scade sul lato servizio.

Il blocco in una sessione potrebbe scadere a causa di diversi motivi:

  • Il timer di blocco è scaduto prima del rinnovo dell'applicazione client.
  • L'applicazione client ha acquisito il blocco, lo ha salvato in un archivio permanente e quindi riavviato. Dopo il riavvio, l'applicazione client ha esaminato le sessioni in corso e ha tentato di elaborare i messaggi in tali sessioni.

È anche possibile ricevere questa eccezione negli scenari seguenti:

  • Aggiornamento del servizio
  • Aggiornamento del sistema operativo
  • Modifica delle proprietà nell'entità (coda, argomento, sottoscrizione) mantenendo il blocco.

Risoluzione

Quando un'applicazione client riceve SessionLockLostException, non può più elaborare i messaggi nella sessione. L'applicazione client può prendere in considerazione la registrazione dell'eccezione per l'analisi, ma il client deve eliminare il messaggio.

Poiché il blocco della sessione è scaduto, torna alla coda (o alla sottoscrizione) e può essere bloccato dall'applicazione client successiva che accetta la sessione. Poiché il blocco della sessione viene mantenuto da una singola applicazione client in qualsiasi momento, l'elaborazione in ordine è garantita.

TimeoutException

Un'eccezione TimeoutException indica che un'operazione avviata dall'utente richiede più tempo del timeout dell'operazione.

Controllare il valore della proprietà ServicePointManager.DefaultConnectionLimit, in quanto il raggiungimento di questo limite può anche causare un evento di TimeoutException.

Si prevede che si verifichino timeout durante o tra operazioni di manutenzione, ad esempio gli aggiornamenti del servizio bus di servizio (o) del sistema operativo sulle risorse che eseguono il servizio. Durante gli aggiornamenti del sistema operativo, le entità vengono spostate e i nodi vengono aggiornati o riavviati, causando timeout. Per informazioni dettagliate sul contratto di servizio per il servizio bus di servizio di Azure, vedere Contratto di servizio per il bus di servizio.

SocketException

Causa

Nei casi seguenti viene generata un'eccezione SocketException :

  • Quando un tentativo di connessione non riesce perché l'host non ha risposto correttamente dopo un'ora specificata (codice di errore TCP 10060).
  • Connessione stabilita non riuscita perché l'host connesso non è riuscito a rispondere.
  • Si è verificato un errore durante l'elaborazione del messaggio o l'host remoto ha superato il timeout.
  • Problema della risorsa di rete sottostante.

Risoluzione

Gli errori SocketException indicano che la macchina virtuale che ospita le applicazioni non è in grado di convertire il nome <mynamespace>.servicebus.windows.net nell'indirizzo IP corrispondente.

Verificare se il comando seguente ha esito positivo nel mapping a un indirizzo IP.

PS C:\> nslookup <mynamespace>.servicebus.windows.net

Quale dovrebbe fornire un output simile al seguente:

Name:    <cloudappinstance>.cloudapp.net
Address:  XX.XX.XXX.240
Aliases:  <mynamespace>.servicebus.windows.net

Se il nome non viene risolto in un indirizzo IP e nell'alias dello spazio dei nomi, rivolgersi all'amministratore di rete per approfondire le indagini. La risoluzione dei nomi viene eseguita tramite un server DNS in genere una risorsa nella rete del cliente. Se la risoluzione DNS viene eseguita da DNS di Azure, contattare supporto tecnico di Azure.

Se la risoluzione dei nomi funziona come previsto, verificare se le connessioni a bus di servizio di Azure sono consentite qui.

UnauthorizedAccessException

Un'eccezione UnauthorizedAccessException indica che le credenziali specificate non consentono l'esecuzione dell'azione richiesta. La Message proprietà contiene informazioni dettagliate sull'errore.

È consigliabile seguire questi passaggi di verifica, a seconda del tipo di autorizzazione fornito durante la costruzione di ServiceBusClient.

Eccezioni di replica geografica

ServerBusyException

Cause

  • Durante la replica asincrona (ritardo di replica maggiore di zero), il client tenta di eseguire un'operazione su un'entità del bus di servizio (coda, argomento) o esegue un'operazione di gestione, ma l'operazione non può essere completata perché il ritardo di replica tra l'area primaria e quella secondaria ha superato il ritardo massimo consentito di replica in secondi.
    • Esempio: l'operazione viene limitata perché con esso il nuovo ritardo di replica raggiungerà 38.323 secondi, che è maggiore del ritardo di replica massimo impostato (300 secondi). Il ritardo di replica corrente per l'operazione più recente da replicare è di 0 secondi.
  • La coda di replica per un'entità supera le dimensioni massime in byte. Le dimensioni massime in byte per una coda di replica sono un limite interno impostato da bus di servizio.
    • Esempio: le dimensioni della coda di replica 73128000 superano la soglia 67108864.
  • Nella replica sincrona si verifica il timeout di una richiesta durante l'attesa della replica di un'altra richiesta.
    • Esempio: volume elevato di richieste dall'applicazione client per <NAMESPACE>/<ENTITYNAME>. La replica in altre aree è in corso.

Risoluzione

  • Il client deve tornare indietro per dare tempo per consentire al servizio di elaborare il carico di lavoro specificato, quindi il client deve riprovare.

Timeout

Causa

  • Un'eccezione di timeout nel ripristino di emergenza geografico indica che l'operazione non è stata completata entro il timeout fornito dal client.
    • Nella replica sincrona, la scrittura e la replica dell'area primaria di un'operazione nelle aree secondarie rientrano nell'ambito del timeout dell'operazione.
    • Nella replica asincrona, la scrittura dell'area primaria di un'operazione rientra nell'ambito del timeout dell'operazione, ma la replica di un'operazione nelle aree secondarie non rientra nell'ambito del timeout dell'operazione.
    • Esempio: l'operazione non è stata completata entro il tempo allocato 00:01:00 per il messaggio oggetto. (ServiceTimeout).

Risoluzione

  • Il client deve ritentare l'operazione.
  • Alcuni passaggi di un'operazione di timeout potrebbero essere stati completati. È possibile che un'operazione di timeout sia stata scritta nell'area primaria e in alcune aree secondarie. Se un'operazione è stata scritta nell'area primaria, alla fine viene replicata in tutte le aree secondarie indipendentemente dal timeout del client.

BadRequest

Causa

  • Durante un failover pianificato, l'area primaria viene impostata temporaneamente come di sola lettura per consentire l'aggiornamento dell'area secondaria. Se il client tenta un'operazione di scrittura nell'area primaria mentre si trova in questo stato di sola lettura temporaneo, il client riceve un'eccezione BadRequest.
    • Esempio: cambio di ruolo di replica in corso, replica primaria:<entity-name> è ReadOnly.

Risoluzione

  • Il client deve attendere il completamento del failover pianificato prima che le operazioni di scrittura abbiano esito positivo.
  • Nel caso in cui il failover pianificato richiede troppo tempo, è possibile attivare invece un failover forzato.

Passaggi successivi

Per informazioni complete sull'API .NET del bus di servizio, vedere Azure .NET API reference (Informazioni di riferimento sulle API di Azure per .NET). Per suggerimenti sulla risoluzione dei problemi, vedere la guida alla risoluzione dei problemi.