2012-08-15 3 views
4

Mime 다중 부분 결과 (실제로는 PDF 파일)를 반환하는 SOAP 서비스에 WCF 클라이언트를 작성하고 있습니다. 그것은 커스텀 메시지 인코더를 사용합니다.WCF 사용자 지정 MessageEncoder를 사용하여 다중 부분 메시지 구문 분석

요청을 단일 파트 형식으로 만들면 서비스가 마음에 들지 않으므로 결과를 다시 얻을 수 있습니다. 내가 볼 수있는 결과의 두 가지 문제점이 있습니다.

  • 다중 부분 메시지의 첫 번째 부분 만 반환하는 것처럼 보입니다.
  • 내가 가져온 데이터는 사용자 정의 인코더로 디코딩 할 수 없습니다.

MTOM 바인딩을 사용해 보았지만 요청이 망가졌습니다. 컨텐트 유형에 "경계"매개 변수를 추가하지 못하기 때문에 서버가 요청을 이해할 수 없습니다.

내가 원하는 것은 기본 텍스트 SOAP 요청이지만 응답은 MTOM 스타일로 디코딩되었다고 생각합니다. 그러나 어떻게 설정해야할지 모르겠습니다. http://blogs.msdn.com/b/carlosfigueira/archive/2011/02/16/using-mtom-in-a-wcf-custom-encoder.aspx

그러나 내 프로젝트에 매우 침습적 인 변화처럼 보인다 :

내가 찾은 가장 가까운 솔루션

이있다.

답변

5

나는 이것을 알아 냈다. 우선 MTOM 인코더를 사용하여 멀티 파트 메시지의 첫 번째 부분 만 가져 오는 중이라고 말했을 때 나는 틀 렸습니다. 나는 모든 것을 얻고 있었다. 나는 디버거에서 그것을보고 있었고, 아래쪽은 디버그 뷰어에서 잘려나 갔을 것입니다. 멀티 파트 메시지를 수동으로보고 해독하는 나의 경험에 비추어 요약하십시오.

둘째 요점은 Content-Type이 멀티 파트/관련이고 모든 것이 잘 작동했을 때 MTOM 인코더를 사용해야한다는 것입니다. 위의 참조 된 기사를 읽으면 메시지가 멀티 파트인지 아니면 일반 텍스트인지를 동적으로 감지하고이를 기반으로 적절한 엔코더를 선택하는 것이 중요합니다. 본질적으로 텍스트 인코더와 MTOM 인코더가 모두 내장 된 맞춤형 인코더이며 수신 메시지의 내용 유형에 따라 앞뒤로 전환합니다.

우리 프로젝트는 응답 메시지가 메인 프로그램 로직으로 전달되기 전에 일부 후 처리가 필요합니다. 따라서 들어오는 SOAP 컨텐츠를 XML 문자열로 가져 와서 XML 조작을 수행합니다.

이것은 기사에서 권장하는 솔루션에서 약간 벗어났습니다. 기사의 솔루션에 필요한 것은 올바른 인코더를 사용하여 System.ServiceModel.Channels.Message에 메시지를 읽고 반환하는 것뿐입니다. 우리의 솔루션에서는이 프로세스를 중단하고 사후 처리를 수행해야합니다. http://meta.stackexchange.com/questions/ -

public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType) 
{ 
    //First, get the incoming message as a byte array 
    var messageData = new byte[buffer.Count]; 
    Array.Copy(buffer.Array, buffer.Offset, messageData, 0, messageData.Length); 
    bufferManager.ReturnBuffer(buffer.Array); 
    //Now convert it into a string for post-processing. Look at the content-type to determine which encoder to use. 
    string stringResult; 
    if (contentType != null && contentType.Contains("multipart/related")) 
    { 
     Message unprocessedMessageResult = this.mtomEncoder.ReadMessage(buffer, bufferManager, contentType); 
     stringResult = unprocessedMessageResult.ToString(); 
    } 
    else { 
     //If it's not a multi-part message, the byte array already has the complete content, and it simply needs to be converted to a string 
     stringResult = Encoding.UTF8.GetString(messageData); 
    } 
    Message processedMessageResult = functionToDoPostProccessing(stringResult); 
    return processedMessageResult; 
} 
+0

잊지 마세요 , 그것은 올바른로 자신의 답을 표시하기 위해 OK입니다 :

하면 해당 작업을 수행하려면 사용자 정의 인코더에 다음을 구현 9933/동의어 - 수락 - 본인 - 자신 - 대답 - 내 - 자신 - 질문 –

관련 문제