Тот факт, что вы используете классы Stream в вашем конвейерном компоненте, не делает его потоковым конвейерным компонентом как таковым , как вы интуитивно удивились.
Наиболее подходящий способ - эторазделите ответственность на два компонента:
- Сначала вы создаете класс
System.IO.Stream
клиента - это класс, который оборачивает исходный входящий поток и предоставляет интерфейс потоковой передачи.В этом классе вы эффективно обрабатываете байты , поскольку они читаются вызывающим кодом.Этот класс не должен зависеть от BizTalk, и вы должны иметь возможность создать образец программы модульного тестирования для этого класса вне BizTalk.
В первом случае я рекомендую перейти к одному из несколько статей с примерами исходного кода .
- Во-вторых, сам компонент конвейера, единственной обязанностью которого является замена входящего потока экземпляром вашего пользовательского потока.Это идиоматический паттерн, который вы найдете в хороших конвейерных компонентах.В частности, при выполнении метода Execute , не следует читать исходный входящий поток .Чтение произойдет - автоматически - само по себе, когда Messaging Agent вступит во владение.
Следующий фрагмент должен быть каноническим исходным кодом для метода 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
классе.
Как я писал в своем ответе на на следующий вопрос , я решительнорекомендуем вам ознакомиться с целой серией публикаций, которые Nic Barden сделал о разработке компонентов потокового конвейера.