es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Servicios de transmisión de tuberías en C#

Supongamos que tienes dos servicios externos:

“`C#
public void Service1(Stream input, Stream output)
{
// Realiza algunas acciones: toma el flujo de entrada,
// lo elabora y devuelve el resultado en el flujo de salida.
}

<pre><code><br />“`C#
public void Service2(Stream input, Stream output)
{
// Realiza algunas acciones: toma el flujo de entrada,
// lo elabora y devuelve el resultado en el flujo de salida.
}

y tienes dos objetos FileStream (o dos objetos Stream en general), uno para leer datos de un archivo y otro para escribir el resultado.

Deseo que los dos servicios sean llamados secuencialmente:
– Pasar el FileStream de lectura como entrada al Service1.
– Tomar el flujo de salida de Service1 y pasarlo como entrada al Service2.
– Pasar el flujo de salida de Service2 al FileStream de escritura.

Mi problema está en el paso 2. Intenté el siguiente código:

“`C#
public void CompressAndEncrypt(Stream input, Stream output)
{
AnonymousPipeServerStream anonymousPipeServerStream = new();
AnonymousPipeClientStream anonymousPipeClientStream = new(anonymousPipeServerStream.GetClientHandleAsString());

<pre><code>Compress(input, anonymousPipeServerStream);
Encrypt(anonymousPipeClientStream, output);
input.CopyTo(anonymousPipeServerStream);
</code></pre>

}
“`

pero no funciona: ¡no hace nada en absoluto!

¿Alguna sugerencia?

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Un posible problema con el código es que se llama a input.CopyTo(anonymousPipeServerStream) después de llamar a Compress y Encrypt. Esto significa que los datos de entrada originales se copian en anonymousPipeServerStream después de que la encriptación ya se haya aplicado, lo que resultaría en una salida incorrecta.

    Para solucionar esto, intenta reorganizar el código de manera que input se copie primero en anonymousPipeServerStream y luego se pase por los métodos Compress y Encrypt. Aquí tienes un ejemplo de cómo podría verse el método CompressAndEncrypt actualizado:

    public void CompressAndEncrypt(Stream input, Stream output)
    {
        AnonymousPipeServerStream anonymousPipeServerStream = new();
        AnonymousPipeClientStream anonymousPipeClientStream = new(anonymousPipeServerStream.GetClientHandleAsString());
    
        // Copia la entrada en anonymousPipeServerStream primero
        input.CopyTo(anonymousPipeServerStream);
    
        // Luego pasa por Compress y Encrypt
        Compress(anonymousPipeServerStream, anonymousPipeClientStream);
        Encrypt(anonymousPipeClientStream, output);
    }
    

    Esto asegurará que los datos de entrada se procesen correctamente a través de ambos servicios antes de que se escriban en el flujo de salida.

Comments are closed.