Semântica de falha para identificadores de contexto
Este tópico discute a semântica de falha para identificadores de contexto.
Semântica de falha ao fechar o identificador de contexto falha
Imagine que um aplicativo cliente está tentando fechar um identificador de contexto aberto no servidor, sem desligar o processo do cliente. Além disso, suponha que a chamada para o servidor para fechar o identificador de contexto falhe (por exemplo, o cliente está sem memória). A maneira adequada de lidar com essa situação é chamar a função RpcSsDestroyClientContext . Nesse caso, o cliente limpa seu lado do identificador de contexto e fecha abortivamente a conexão com o servidor. Como a conexão é realmente um pool de conexões (consulte RPC e a Rede), que é contado por referência com uma referência para cada associação aberta ou identificador de contexto, destruir o identificador de contexto chamando a função RpcSsDestroyClientContext não realmente destrói a conexão. Em vez disso, ele diminui a contagem de referência para o pool de conexões. Para que as conexões no pool sejam fechadas, o cliente precisa fechar todos os identificadores de associação e identificadores de contexto para esse servidor do processo do cliente. Em seguida, todas as conexões no pool são fechadas e o mecanismo de execução do servidor é iniciado e limpo.
Semântica de falha durante a alteração do estado do identificador de contexto
As informações nesta seção referem-se ao Windows XP e às plataformas posteriores.
Identificadores de contexto são simplesmente parâmetros para uma função. Todas as alterações no estado de um identificador de contexto ocorrem quando os parâmetros são realizados em marshaling ou não gravados. Por exemplo, se um cliente abrir um identificador de contexto (alterá-lo de NULL para não NULL), o tempo de execução do RPC não abrirá realmente a parte RPC do identificador até que os argumentos sejam realizados em marshaling para envio ao cliente. Falhas podem ocorrer durante o ínterim. Devido a uma variedade de possíveis condições de rede ou de pouco recurso, a transmissão do pacote para o cliente pode falhar. Ou a rotina do servidor pode gerar uma exceção ao tentar alterar um identificador de contexto. Nessas ou em outras situações de falha, o cliente e o servidor podem obter exibições inconsistentes do identificador de contexto. Esta seção explica a regra para o estado do identificador de contexto e a responsabilidade do código do cliente e do servidor durante várias condições de falha.
Um identificador de contexto NULL chega, mas a rotina do servidor encontra uma falha e gera uma exceção.
É responsabilidade da rotina do servidor limpo qualquer estado relacionado ao identificador de contexto que ele possa ter criado. O tempo de execução do RPC limpa seu estado.
Um identificador de contexto não NULL chega, mas a rotina do servidor encontra uma falha e gera uma exceção.
Se a rotina do servidor fechou o identificador de contexto, o cliente não saberá disso, pois a chamada não terá êxito; o uso adicional do identificador de contexto resultará em um erro de RPC_X_SS_CONTEXT_MISMATCH no cliente. Se a rotina do servidor não modificar o identificador de contexto, o cliente ainda poderá usá-lo. Se a rotina do servidor alterar as informações armazenadas no contexto do servidor, novas chamadas do cliente usarão essas informações.
Um identificador de contexto não NULL chega e a rotina do servidor fecha o identificador, mas o marshaling após o marshaling do identificador de contexto falhar ou o processamento após a falha do marshaling.
O identificador de contexto é fechado e outras chamadas desse cliente usando esse identificador de contexto resultam em um erro de RPC_X_SS_CONTEXT_MISMATCH no cliente.
Um identificador de contexto NULL chega e o servidor cria seu contexto para esse identificador, mas o marshaling após o marshaling do identificador de contexto falhar ou o processamento após o marshaling falhar.
Nesse caso, o tempo de execução de RPC invoca o run down para esse identificador de contexto e limpa o estado RPC para esse identificador de contexto. O identificador de contexto não será criado no lado do cliente.
Um identificador de contexto não NULL chega e o servidor não altera o identificador de contexto ou altera as informações armazenadas no contexto do servidor e o marshaling falha após o marshaling do identificador de contexto.
Novas chamadas do cliente usarão o identificador de contexto que o servidor tem.
Um identificador de contexto NULL chega e o servidor não o define como nada além de NULL, mas a chamada falha antes do marshaling do identificador de contexto.
Nesse caso, nenhum identificador de contexto é criado no cliente.
Um identificador de contexto não NULL chega e o servidor o define como NULL, mas o marshaling falha antes que o identificador de contexto seja realizado em marshaling.
Nesse caso, o identificador de contexto permanece fechado no servidor e o cliente recebe RPC_X_SS_CONTEXT_MISMATCH erros quando tenta usar o identificador de contexto.
Um identificador de contexto NULL chega no servidor e o servidor o define como não NULL, mas o marshaling falha antes que o identificador de contexto seja realizado em marshaling.
O identificador de contexto deve ser invocado para que o servidor possa limpo para cima e nenhum identificador de contexto será criado no cliente.
Um identificador de contexto não NULL chega e o servidor não altera o identificador de contexto ou altera as informações armazenadas no contexto do servidor e o marshaling falha antes que o identificador de contexto seja empacotado.
Novas chamadas do cliente usarão o estado no servidor.
Um identificador de contexto é declarado como um valor retornado e a rotina do servidor retorna NULL para o identificador de contexto e o marshaling falha antes que o identificador de contexto seja realizado em marshaling.
Nesse caso, nenhum novo contexto é criado no cliente.
Um identificador de contexto é declarado como um valor retornado e a rotina do servidor retorna não NULL para o identificador de contexto e o marshaling falha antes que o identificador de contexto seja realizado em marshaling.
O tempo de execução de RPC chama a rotina de execução de identificador de contexto para dar a ele a chance de limpo e nenhum novo contexto é criado no cliente.