2011-01-07 3 views
5

텍스트가 포함 된 스트림이 있습니다. 이제 해당 스트림에서 일부 텍스트 (일부 값 바꾸기)를 편집하고 싶습니다.BizTalk 파이프 라인 구성 요소에서 스트림의 텍스트를 효율적으로 수정하려면 어떻게해야합니까?

스트림을 중단하지 않고 가장 효율적인 방법은 무엇입니까? 이것을 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()을 수행 할 때 내가 스트림을 파괴하고 볼 수 있습니다.

더 좋은 방법이 있나요?

답변

2

검색 할 수없는 읽기 전용 스트림의 간단한 경우 Stream.Read (및 가능한 경우 Stream.ReadByte) 메소드에서 필요에 따라 즉석에서 바꾼 래퍼 스트림을 만들 수 있습니다. 그러나 이들은 원시 바이트로 작업하므로 스트림 인코딩도 고려해야 할 수 있습니다.

+0

일부 코드 샘플을 좀 더 자세히 설명해 주실 수 있습니까? 나는 스트리밍 경험이 없다 .. thx –

4

파이프 클래스 구성 요소에서 Stream 클래스를 사용한다고해서 직관적으로 궁금해했던대로 스트리밍 파이프 라인 구성 요소 당이 아닙니다.

가장 적절한 방법은 두 가지 구성 요소로 responsabilities을 분할하는 것입니다

  • 첫째, 고객 System.IO.Stream 클래스를 생성 - 즉 원래의 입력 스트림을 감싸고 스트리밍 인터페이스를 노출하는 클래스입니다. 이 클래스에서는 바이트를 효율적으로 처리하기 위해 호출 코드로을 읽습니다. 이 클래스는 BizTalk에 대한 종속성이 없어야하며 BizTalk 외부에서이 클래스에 대한 샘플 단위 테스트 프로그램을 만들 수 있어야합니다.

첫 번째 경우는 several articleswith source code samples 중 하나를 검색하는 것이 좋습니다.

  • 두 번째로 파이프 라인 구성 요소 자체는 수신 스트림을 사용자 지정 스트림 인스턴스로 대체하는 것이 유일한 책임입니다. 이것은 좋은 파이프 라인 구성 요소에서 찾을 수있는 관용적 패턴입니다. 특히 Execute method, 을 실행하는 동안 원래 들어오는 스트림을 읽지 않아야합니다. 독서는 자동으로 - Messaging Agent이 대신 할 때 일어납니다.

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

    은 참조 :

다음 코드는 은 물론, 오류 처리를위한 추가 코드를 금지, Execute 방법에 대한 표준 소스 코드해야 하는가? 앞의 방법에서 아무 것도 읽지 않습니다. 전체 처리는 Stream 클래스의 Read 메서드 호출 (repated) 중에 발생해야합니다.

the following question에 대한 내 답변에서, Nic Barden이 스트리밍 파이프 라인 구성 요소 개발에 대해 수행 한 모든 일련의 게시물을 확인하시기 바랍니다.

0

나는 완성 된 버퍼와 처리 버퍼를 유지하는 것이 좋다고 생각한다. 스트림에 새로운 내용을 쓸 때 보류중인 버퍼에 유지해야한다. 바꾸거나 아무것도 결정하지 않으면 보류중인 버퍼에서 완료된 버퍼로 해당 데이터를 옮기십시오. 읽기 메서드는 완료된 버퍼에서 읽기만 수행해야하며 쓰기는 처리 버퍼에 쓰기 만하고 플러시는 수행 된 모든 보류중인 작업을 이동해야합니다.

플러시 부분에 대해 shure하지, 내가 일반적인 문자열 replacer 스트림을 작성해야 할 때 가장 좋은 방법으로이 작업을 수행하는 방법을 생각하고 있습니다.

[편집] 죄송합니다. 2 년 전으로 답변했습니다 ... [/ 편집]