كيف يمكنني تعديل النص في دفق بكفاءة ، في مكون خط أنابيب BizTalk؟

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

سؤال

لدي دفق يحتوي على نص ، وأريد الآن تحرير بعض النص (استبدال بعض القيم) في هذا الدفق.

ما هي الطريقة الأكثر كفاءة للقيام بذلك ، لذلك دون كسر الدفق؟ أريد استخدام هذا في مكون خط أنابيب مخصص لـ 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;
}

هذا هو الرمز ، لكن كما ترون أنني أقوم بتكسير الدفق عندما أفعل sr.ReadToEnd().

هل هناك طريقة بيتشر للقيام بذلك؟

لا يوجد حل صحيح

نصائح أخرى

حقيقة أنك تستخدم فئات الدفق في مكون خط الأنابيب الخاص بك لا تجعله أ مكون خط أنابيب البث لكل س. كما تساءلت بشكل حدسي.

الطريقة الأنسب هي تقسيم المسؤوليات إلى مكونين:

  • أولاً ، يمكنك إنشاء عميل System.IO.Stream الفئة - هذه فئة تلتف التيار الوارد الأصلي وتكشف واجهة تدفق. في هذا الفصل ، ستقوم بمعالجة البايتات بفعالية كما يقرأون بواسطة رمز الاتصال. لا ينبغي أن يكون لهذا الفئة أي اعتماد على biztalk ويجب أن تكون قادرًا على إنشاء برنامج اختبار للوحدة لهذه الفئة خارج BizTalk.

للحالة الأولى ، أوصيك بالتصفح إلى واحد من عدة مقالات مع عينات رمز المصدر.

  • ثانياً ، مكون خط الأنابيب نفسه ، الذي مسؤولته الوحيدة هو استبدال الدفق الوارد مع مثيل للتيار المخصص الخاص بك. هذا نمط اصطلاح ستجده في مكونات خطوط أنابيب جيدة. على وجه الخصوص ، أثناء تنفيذ تنفيذ طريقة, يجب ألا تقرأ الدفق الوارد الأصلي. ستحدث القراءة - تلقائيا - في حد ذاته عندما وكيل المراسلة يستحوذ على.

يجب أن يكون المقتطف التالي رمز المصدر الكنسي ل Executeالطريقة ، باستثناء رمز إضافي لمعالجة الأخطاء ، بالطبع:

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;
}

نرى؟ لا القراءة على الإطلاق في الطريقة السابقة. يجب أن تحدث المعالجة بأكملها أثناء مكالمات (إعادة التوليد) من Read الطريقة في العرف الخاص بك Stream صف دراسي.

كما كتبت في ردي على السؤال التالي, ، أشجعك بشدة على التحقق من سلسلة المشاركات بأكملها نيك باردين فعلت حول تطوير مكونات خط أنابيب البث.

للحالة البسيطة للتيار غير القابل للبحث فقط ، يمكنك إنشاء دفق غلاف يقوم باستبدال الطيران حسب الحاجة في Stream.Read (وربما Stream.ReadByte) طريقة. ومع ذلك ، فإن هذه العمل مع بايتات الخام ، لذلك قد تضطر إلى حساب ترميز الدفق أيضًا.

أعتقد أن الطريقة التي يجب أن تنتهي بها ومخزن مؤقت للمعالجة ، فأنت عندما تحصل على محتوى جديد مكتوبة إلى دفقك ، فأنت تبقيه في المخزن المؤقت المعلق حتى تعرف أنه لا يوجد شيء آخر لاستبداله. بعد استبداله أو تحديده ، لا يوجد شيء لاستبدال هذه البيانات من المعلقة إلى المخزن المؤقت الذي تم. يجب أن تقرأ طريقة القراءة فقط من المخزن المؤقت الذي تم القيام به ، يجب أن تكتب الكتابة فقط إلى المخزن المؤقت للمعالجة وتنقل التدفق كل المعلقة التي يتم القيام بها.

لا أتعامل مع جزء التدفق ، فأنا أفكر في كيفية القيام بذلك بأفضل طريقة لأنني بحاجة إلى كتابة دفق استبدال سلسلة عامة.

تحرير] آسف ، أجاب منشور عمره عامين ... [/تحرير

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top