2009-06-02 5 views
5

C# 응용 프로그램에서 Windows Message Queue를 통해 레거시 응용 프로그램과 통신해야합니다.System.Messaging.MessageQueue가 XML로 문자열을 래핑하지 않게하려면 어떻게해야합니까?

레거시 응용 프로그램은 특정 개인 큐의 일반 문자열 메시지를 예상하지만 System.Messaging.MessageQueue가 XML로 메시지를 래핑하지 못하게합니다!

내가 테스트 해요 코드는 매우 간단합니다 :

MessageQueue myQueue = new MessageQueue(@".\Private$\tolegacy"); 
Message msg = new Message("My Test String"); 
myQueue.Send(msg); 

문제는 메시지가있는 XML 직렬화와 같은 큐에 나타납니다 있다는 것입니다 : 할 수 없습니다

<?xml version="1.0"?><string>My Test String</string> 

레거시 응용 프로그램의 동작을 수정하여 System.Messaging.MessageQueue가 내 메시지를 XML로 포맷하는 것을 막아야합니다.

아무도 도와 줄 수 있습니까?

답변

3

당신은있는 IMessageFormatter를 구현하는 클래스입니다 (자신의 포매터를 생성하고 메시지 여기

의 포맷터 속성에 할당 Message.Formatter 속성에 MSDN에 link입니다 수 있습니다.

I을 이것을 시도하지는 않았지만 BodyStream을 사용하여 메시지를 작성할 수 있어야합니다. 포맷터를 무시할 것으로 생각합니다.

+0

직접 BodyStream에 쓰기가 작동했습니다. 그것은 가장 쉬운 변화처럼 보였습니다. 그래서 처음에 시도해 보았습니다. – Damovisa

+0

나는 여러 필자를 작성했으며 그들은 정말 잘 작동합니다. 걱정할 필요가있는 것은 발신자와 수신자가 신체 유형을 이해하는 것입니다. –

+0

비슷한 문제가 있습니다. 우리는 큐를 읽고 쓸 수 있고 메시지를 다시 얻을 수 있습니다. 그러나 벤더가 대기열을 읽을 때 그는 우리 메시지를 감싸는 여분의 "물건"을 보게됩니다. 랩핑 (wrapping)이 전혀없는 간단한 문자열을 작성하는 방법은 무엇입니까? BinaryFormatter조차도 문자열의 시작 부분에 일련의 바이트를 추가했습니다. – NealWalters

3

ActiveXMessageFormatter을 사용하면 원하는 결과를 얻을 수 있습니다. 문자열을 대기열에 넣고 리스너 처리 본문에서 문자열로 읽습니다. ActiveXMessageFormatter은 기본 데이터 형식을 serialize/deserialize하는 데 사용되며 기본값이 XmlMessageFormatter 인 경우처럼 입력에 XML 래퍼를 적용하지 않습니다.

mq.Formatter = new ActiveXMessageFormatter(); 

Here은 3 가지 형식 지정자를 설명하는 또 다른 링크입니다.

관련 문제