Condividi tramite


Semantica degli errori per handle di contesto

In questo argomento viene illustrata la semantica degli errori per gli handle di contesto.

Semantica degli errori durante la chiusura dell'handle di contesto non riesce

Si supponga che un'applicazione client stia tentando di chiudere un handle di contesto aperto nel server, senza arrestare il processo client. Si supponga inoltre che la chiamata al server per chiudere l'handle di contesto abbia esito negativo ( ad esempio, il client non è in memoria). Il modo corretto per gestire questa situazione consiste nel chiamare la funzione RpcSsDestroyClientContext . In tal caso, il client pulisce il lato dell'handle di contesto e chiude in modo interrotto la connessione al server. Poiché la connessione è realmente un pool di connessioni (vedere RPC e rete), che viene conteggiato con un riferimento per ogni handle di associazione o contesto aperto, eliminando l'handle di contesto chiamando la funzione RpcSsDestroyClientContext non distrugge effettivamente la connessione. Invece, decrementa il conteggio dei riferimenti per il pool di connessioni. Per chiudere le connessioni nel pool, il client deve chiudere tutti gli handle di associazione e i handle di contesto a tale server dal processo client. Tutte le connessioni nel pool vengono quindi chiuse e il meccanismo di esecuzione del server viene avviato e pulito.

Semantica degli errori durante la modifica dello stato dell'handle di contesto

Le informazioni contenute in questa sezione si riferiscono a Windows XP e alle piattaforme successive.

Gli handle di contesto sono semplicemente parametri per una funzione. Tutte le modifiche apportate allo stato di un handle di contesto si verificano quando i parametri vengono sottoposto a marshalling o non sincronizzati. Ad esempio, se un client apre un handle di contesto (lo modifica da NULL a non NULL), il runtime RPC non apre effettivamente la parte RPC dell'handle finché non viene eseguito il marshalling degli argomenti per l'invio al client. Gli errori possono verificarsi durante il periodo intermedio. A causa di una serie di possibili condizioni di rete o risorse ridotte, la trasmissione del pacchetto al client potrebbe non riuscire. In alternativa, la routine del server può generare un'eccezione durante il tentativo di modificare un handle di contesto. In queste o altre situazioni di errore, il client e il server possono ottenere visualizzazioni incoerenti dell'handle di contesto. In questa sezione viene illustrata la regola per lo stato dell'handle di contesto e la responsabilità del codice client e server durante varie condizioni di errore.

  • Arriva un handle di contesto NULL , ma la routine del server rileva un errore e genera un'eccezione.

    È responsabilità della routine del server pulire qualsiasi stato correlato all'handle del contesto che potrebbe essere stato creato. Il runtime RPC pulisce lo stato.

  • Arriva un handle di contesto non NULL , ma la routine del server rileva un errore e genera un'eccezione.

    Se la routine del server ha chiuso l'handle di contesto, il client non lo saprà, poiché la chiamata non avrà esito positivo; l'ulteriore uso dell'handle di contesto genererà un errore di RPC_X_SS_CONTEXT_MISMATCH nel client. Se la routine del server non modifica l'handle di contesto, il client può comunque usarlo. Se la routine del server modifica le informazioni archiviate nel contesto del server, le nuove chiamate dal client useranno tali informazioni.

  • Arriva un handle di contesto non NULL e la routine del server chiude l'handle, ma il marshalling dopo che l'handle di contesto è stato sottoposto a marshalling non è riuscito oppure l'elaborazione dopo il marshalling non è riuscita.

    L'handle di contesto viene chiuso e altre chiamate da questo client che usano questo handle di contesto generano un errore RPC_X_SS_CONTEXT_MISMATCH nel client.

  • Arriva un handle di contesto NULL e il server crea il contesto per questo handle, ma il marshalling dopo il marshalling dell'handle di contesto non è riuscito o l'elaborazione dopo l'esito negativo del marshalling.

    In questo caso, il tempo di esecuzione RPC richiama l'esecuzione per questo handle di contesto e pulisce lo stato RPC per questo handle di contesto. L'handle di contesto non verrà creato sul lato client.

  • Arriva un handle di contesto non NULL e il server non modifica l'handle di contesto oppure modifica le informazioni archiviate nel contesto del server e il marshalling ha esito negativo dopo il marshalling dell'handle di contesto.

    Le nuove chiamate dal client useranno l'handle di contesto del server.

  • Arriva un handle di contesto NULL e il server non lo imposta su un valore diverso da NULL, ma la chiamata non riesce prima che venga eseguito il marshalling dell'handle di contesto.

    In questo caso, nel client non viene creato alcun handle di contesto.

  • Arriva un handle di contesto non NULL e il server lo imposta su NULL, ma il marshalling ha esito negativo prima che venga eseguito il marshalling dell'handle di contesto.

    In questo caso, l'handle di contesto rimane chiuso nel server e il client ottiene RPC_X_SS_CONTEXT_MISMATCH errori quando tenta di usare l'handle di contesto.

  • Un handle di contesto NULL arriva sul server e il server lo imposta su non NULL, ma il marshalling ha esito negativo prima che venga eseguito il marshalling dell'handle di contesto.

    L'handle di contesto deve essere richiamato in modo che il server possa eseguire la pulizia e non verrà creato alcun handle di contesto nel client.

  • Arriva un handle di contesto non NULL e il server non modifica l'handle di contesto oppure modifica le informazioni archiviate nel contesto del server e il marshalling ha esito negativo prima che venga eseguito il marshalling dell'handle di contesto.

    Le nuove chiamate dal client useranno lo stato nel server.

  • Un handle di contesto viene dichiarato come valore restituito e la routine del server restituisce NULL per l'handle di contesto e il marshalling ha esito negativo prima che l'handle di contesto venga sottoposto a marshalling.

    In questo caso, nel client non viene creato alcun nuovo contesto.

  • Un handle di contesto viene dichiarato come valore restituito e la routine del server restituisce un valore diverso da NULL per l'handle di contesto e il marshalling ha esito negativo prima che venga eseguito il marshalling dell'handle di contesto.

    Il runtime RPC chiama la routine di esecuzione dell'handle di contesto per consentire la pulizia e non viene creato alcun nuovo contesto nel client.