Saltar al contenido

¿Qué podría estar causando un error “No se puede acceder a un objeto eliminado” en WCF?

Solución:

Srv_LoginChannelFactory.Close() es donde se desecha. Cuando cierra, está renunciando a cualquier recurso no administrado que tuviera. Intentar hacer algo diferente a inspeccionar su estado o volver a abrirlo da como resultado la excepción “No se puede acceder a un objeto eliminado”.

Esto es cierto cada vez que cierra un objeto desechable y luego intenta hacer algo con él. Por ejemplo, escribir en un archivo que está cerrado o ejecutar una instrucción SQL en una conexión de base de datos cerrada.

Para abordar esto, tiene tres opciones.

  1. No haga de Srv_LoginChannelFactory un campo. En su lugar, hágalo local al clic del botón. Si este es el único lugar donde lo está usando, probablemente tenga sentido porque acorta la cantidad de tiempo que está usando un recurso no administrado.

  2. Implemente IDisposable (se supone que debe hacer esto siempre que tenga un campo que sea Desechable) no cierre Srv_LoginChannelFactory excepto en Login.Dispose.

  3. Cambie el botón, haga clic para verificar el estado de Srv_LoginChannelFactory antes de intentar crear un canal con él. Aún necesita implementar IDisposable en caso de que no se haga clic en el botón.

Nota: Asegúrese de abrir parece que podría usarse para verificar el estado, pero solo funciona antes de que se abra. Una vez cerrado, arrojará.

En cuanto a que Close () es lo mismo que Dispose.

De la sección ‘Personalización de un nombre de método de eliminación’ al implementar Finalizar y eliminar para limpiar recursos no administrados en las Pautas de diseño para desarrollar bibliotecas de clases

Ocasionalmente, un nombre específico de dominio es más apropiado que Dispose. Por ejemplo, es posible que una encapsulación de archivos desee utilizar el nombre de método Close. En este caso, implemente Dispose de forma privada y cree un método Close público que llame a Dispose. El siguiente ejemplo de código ilustra este patrón. Puede reemplazar Close con un nombre de método apropiado para su dominio. Este ejemplo requiere el espacio de nombres del sistema.

La idea aquí es dar paridad al método Open. Personalmente, creo que causa mucha confusión, pero no puedo pensar en nada mejor (¿Cerrar y disponer?)

El problema aquí (que creo que Conrad se perdió) es que Kerezo está cerrando ChannelFactory (Srv_LoginChannelFactory) que cierra (elimina) todos sus canales, cuando probablemente quiera cerrar solo el Channel (LoginService).

Así que cambia:

    Srv_LoginChannelFactory.Close();

para:

    try
    {
        LoginService.Close();
    }
    catch
    {
        LoginService.Abort();
    }
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *