¿Cómo puedo modificar el texto en una corriente de manera eficiente, en un componente de canalización de BizTalk?

StackOverflow https://stackoverflow.com/questions/4625819

Pregunta

Tengo una corriente que contiene texto, ahora quiero editar un texto (sustituir algunos valores) en esa corriente.

¿Cuál es la forma más eficiente de hacer esto, sin romper la corriente? Quiero usar esto en un componente de canalización personalizado para BizTalk.

public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg)
{
    string msg = "";
    using (VirtualStream virtualStream = new VirtualStream(pInMsg.BodyPart.GetOriginalDataStream()))
    {
        using(StreamReader sr = new StreamReader(VirtualStream))
        {
            msg = sr.ReadToEnd();
        }

        // modify string here
        msg = msg.replace("\r\n","");

        while (msg.Contains(" <"))
           msg = msg.Replace(" <", "<");

        VirtualStream outStream = new VirtualStream();
        StreamWriter sw = new StreamWriter(outStream, Encoding.Default);
        sw.Write(msg);
        sw.Flush();
        outStream.Seek(0, SeekOrigin.Begin);

        pInMsg.BodyPart.Data = outStream;
        pContext.ResourceTracker.AddResource(outStream);
    }

    return pInMsg;
}

Este es el código, pero como se puede ver estoy rompiendo la corriente cuando lo haga sr.ReadToEnd().

¿Hay una manera mejor sería hacer esto?

No hay solución correcta

Otros consejos

El hecho de que está utilizando las clases Stream en su componente de canalización no lo convierten en un Streaming componente de canalización per se como usted se ha preguntado de manera intuitiva.

La forma más adecuada es la de dividir las responsabilidades en dos componentes:

  • En primer lugar, se crea una clase System.IO.Stream cliente - que es una clase que envuelve la corriente de entrada original y muestra una interfaz de streaming. En esta clase, que le procesar con eficacia los bytes como se leen por el código de llamada. Esta clase debe tener ninguna dependencia sobre BizTalk y usted debería ser capaz de crear un programa de pruebas de unidad de muestra para este BizTalk fuera de clase.

En el primer caso, le recomiendo que busque una de varios artículos con ejemplos de código fuente .

  • En segundo lugar, el componente de canalización en sí, cuya responsabilidad única es sustituir la corriente entrante con una instancia de la corriente medida. Este es un patrón idiomática que encontrará en buenas componentes de canalización. En particular, durante la ejecución de la Ejecutar método , no se debe leer la secuencia de entrada original, . La lectura va a pasar - automagicamente - por sí mismo cuando el Agente de mensajería se hace cargo.

El siguiente fragmento debe ser el código fuente canónica para un Executemethod, salvo código adicional para el manejo de errores, por supuesto:

IBaseMessage IComponent.Execute(IPipelineContext pContext, IBaseMessage pInMsg)
{
   // assign a new CustomStream to the incoming message

    System.IO.Stream stream = pInMsg.BodyPart.GetOriginalDataStream();
    System.IO.Stream customStream = new CustomStream(stream);

    // return the message for downstream pipeline components (further down in the pipeline)

    pInMsg.BodyPart.Data = customStream;
    pContext.ResourceTracker.AddResource(customStream);

    return pInMsg;
}

Vea? Sin leer alguna en el método anterior. El procesamiento entero debería suceder durante las llamadas (repated) del método Read en su clase Stream personalizado.

Como he escrito en mi respuesta a la siguiente pregunta , te recomendamos que echa un vistazo a toda la serie de mensajes Nic Barden ha hecho sobre desarrollo Streaming Pipeline Components.

En el caso simple de corriente de sólo lectura no reubicable, puede crear una corriente de contenedor que hace las reemplaza en la marcha según sea necesario en el método (y posiblemente el Stream.Read) Stream.ReadByte. Sin embargo, estos trabajos con bytes sin formato, por lo que puede tener para tener en cuenta la corriente de codificación también.

Creo que la forma sería mantener un hecho y un tampón de procesamiento, entonces cuando llegue un nuevo contenido escrito a su torrente que lo guarde en la memoria intermedia en espera hasta que se sabe que no hay nada más para reemplazar. Después de sustituir o decidir que no hay nada para reemplazar a medida que los datos de la pendiente de la memoria intermedia se haga. El método de lectura sólo debe leer de la memoria intermedia de hecho, la escritura sólo debe escribir en el buffer de procesamiento y se mueve a ras toda la pendiente de hacer.

No Shure sobre la parte de descarga, pienso en mí mismo cómo hacer esto de la mejor manera, ya que necesito para escribir una secuencia de cadena sustituto genérico.

[editar] Lo sentimos, respondió un 2 años de edad post ... [/ editar]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top