Partilhar via


Semântica de falha para identificadores de contexto

Este tópico discute a semântica de falha para identificadores de contexto.

Falha na semântica ao fechar o identificador de contexto

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 falha (por exemplo, o cliente está sem memória). A maneira adequada de lidar com essa situação é chamar a funçãoRpcSsDestroyClientContext. Nesse caso, o cliente limpa seu lado do identificador de contexto e fecha aborativamente a conexão com o servidor. Como a conexão é realmente um pool de conexões (consulte RPC e ode rede), que é contado por referência com uma referência para cada ligação aberta ou identificador de contexto, destruir o identificador de contexto chamando a função de RpcSsDestroyClientContext não destrói a conexão. Em vez disso, 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 todas as alças de ligação e identificadores de contexto para esse servidor a partir 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 de estado do identificador de contexto

As informações nesta seção referem-se ao Windows XP e plataformas posteriores.

Os identificadores de contexto são simplesmente parâmetros para uma função. Todas as alterações no estado de um identificador de contexto acontecem quando os parâmetros são empacotados ou desempacotados. Por exemplo, se um cliente abrir um identificador de contexto (alterá-lo de NULL paraNULL não-), o tempo de execução RPC não abrirá a parte RPC do identificador até que os argumentos sejam empacotados para envio ao cliente. Falhas podem ocorrer durante o intervalo. Devido a uma variedade de possíveis condições de rede ou baixo recurso, a transmissão do pacote para o cliente pode falhar. Ou a rotina do servidor pode lançar 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 lança uma exceção.

    É responsabilidade da rotina do servidor limpar qualquer estado relacionado ao identificador de contexto que ele possa ter criado. O tempo de execução RPC limpa seu estado.

  • Um identificador de contexto deNULL não chega, mas a rotina do servidor encontra uma falha e lança uma exceção.

    Se a rotina do servidor fechou o identificador de contexto, o cliente não saberá disso, uma vez que 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 deNULL não chega, e a rotina do servidor fecha o identificador, mas o marshaling depois que o identificador de contexto foi empacotado falhou ou o processamento depois que o marshaling falhou.

    O identificador de contexto é fechado e outras chamadas feitas por esse cliente usando esse identificador de contexto resultam em um erro de RPC_X_SS_CONTEXT_MISMATCH no cliente.

  • Um identificador de contexto de NULL chega, e o servidor cria seu contexto para esse identificador, mas o marshaling depois que o identificador de contexto foi empacotado falhou ou o processamento depois que o marshaling falhou.

    Nesse caso, o tempo de execução 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 deNULL não chega, e o servidor não altera o identificador de contexto ou altera as informações armazenadas no contexto do servidor, e o empacotamento falha depois que o identificador de contexto é empacotado.

    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 para nada além de NULL , mas a chamada falha antes que o identificador de contexto seja empacotado.

    Nesse caso, nenhum identificador de contexto é criado no cliente.

  • Um identificador de contexto NULLnão chega e o servidor o define como NULL, mas o marshaling falha antes que o identificador de contexto seja empacotado.

    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 de NULL chega ao servidor e o servidor o define como não-NULL, mas o marshaling falha antes que o identificador de contexto seja empacotado.

    O identificador de contexto executado para baixo deve ser invocado para que o servidor possa limpar e nenhum identificador de contexto será criado no cliente.

  • Um identificador de contexto NULLnão 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 de retorno, e a rotina do servidor retorna NULL para o identificador de contexto e o empacotamento falha antes que o identificador de contexto seja empacotado.

    Neste caso, nenhum novo contexto é criado no cliente.

  • Um identificador de contexto é declarado como um valor de retorno e a rotina do servidor retornaNULL não para o identificador de contexto e o empacotamento falha antes que o identificador de contexto seja empacotado.

    O tempo de execução RPC chama a rotina de execução do identificador de contexto para dar a ele a chance de limpeza, e nenhum novo contexto é criado no cliente.