나는 이것을 알아 냈다. 우선 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;
}
잊지 마세요 , 그것은 올바른로 자신의 답을 표시하기 위해 OK입니다 :
하면 해당 작업을 수행하려면 사용자 정의 인코더에 다음을 구현 9933/동의어 - 수락 - 본인 - 자신 - 대답 - 내 - 자신 - 질문 –