2012-06-19 3 views
2

MSMQ를 사용하는 WCF 서비스를 만들었습니다.
여러 .NET 클라이언트가이 서비스를 사용하고 메시지를 보낼 수 있어야합니다.
부분적으로 클라이언트는 WCF가없는 .NET 버전 (예 : .NET 1.1)으로 작성됩니다.
이러한 클라이언트의 경우 Msmq API를 직접 사용합니다.
메시지의 인코딩이 서비스 측의 예상 인코딩과 맞지 않는 것이 문제입니다.
그래서 나는 customBinding 사용하여 서비스 측의 메시지 인코딩을 변경하려고 :레거시 클라이언트에서 WCF 서비스 사용 (MSMQ 사용)

<bindings> 
    <customBinding> 
     <binding name="MyCustomBinding"> 
      <!-- available encodings: --> 
      <!-- <textMessageEncoding /> --> 
      <!-- <binaryMessageEncoding /> --> 
      <!-- <mtomMessageEncoding /> --> 
      <!-- <webMessageEncoding /> --> 

      <msmqTransport ...> 
       <msmqTransportSecurity ... /> 
      </msmqTransport> 
     </binding> 
    </customBinding> 
</bindings> 

내가 네 미리 정의 된 인코딩 중 하나로 제한하고 추측 : textMessageEncoding, binaryMessageEncoding, mtomMessageEncoding, webMessageEncoding.

System.Messaging.Message msmqMessage = new System.Messaging.Message(); 
msmqMessage.Formatter = new System.Messaging.ActiveXMessageFormatter(); 
//msmqMessage.Formatter = new System.Messaging.BinaryMessageFormatter(); 
//msmqMessage.Formatter = new System.Messaging.XMLMessageFormatter(); 

어떤 포맷이 예상 인코딩으로 적합하지 보인다 :

는 클라이언트 측에서 나는 포맷을 변경했습니다. 인코딩을 통합하는 또 다른 방법이 있습니까? 아마도 맞춤 인코더 또는 이와 비슷한 것일 수 있습니까? 아니면 포맷터 및 인코더 조정이 완전히 잘못 되었습니까?

미리 감사드립니다.

답변

2

당신은 MsmqIntegrationBinding에 내장을 사용하여 XML로 직렬화 형식을 설정할 수 있습니다

<service name="MyQueueListenner"> 
    <endpoint address="msmq.formatname:DIRECT=OS:.\private$\myQueue" 
       binding="msmqIntegrationBinding" 
       bindingConfiguration="DotNetBinding" 
       contract="MyContract" /> 
    </service> 
    ... 

    <msmqIntegrationBinding> 
    <binding serializationFormat="Xml" name="DotNetBinding" durable="false" exactlyOnce="false"> 
     <security mode="None" /> 
    </binding> 
    </msmqIntegrationBinding> 

UPDATE

그 WCF는 비 지원할 수 있도록 바인딩 통합의 요점은 최대 상호 운용성이다. Net msmq 클라이언트 (ActiveX, Java).

이러한 이유로 데이터 계약 (String 초과)은 의미가 없습니다.

MS는 사람들이 더 낮은 버전의 .Net 버전과 WCF 사이의 interop에이 코드를 사용한다고 생각하지 않았습니다.

내가 제안 할 수있는 유일한 점은 http를 통해 유형을 공개하는 단방향 조작 세트를 정의한 다음 클라이언트가이 엔드 포인트에서 wsdl을 사용할 수 있도록 허용하는 mex 엔드 포인트를 호스트하는 것입니다.

그런 다음이 명령을 사용하여 msmq 끝점과 함께 사용할 로컬 형식 정의를 작성할 수 있습니다.

실제로 http 작업을 호출해서는 안되며, NotImplementedException을 throw해야합니다.

+0

Thx. 그래서 두 번째 대기열을 듣고'MsmqMessage '을 취하는 두 번째 계약을 구현해야합니까? –

+0

예를 들어, 각 클라이언트의 다른 버전에 대해 두 번째 끝점을 노출해야합니다. 단, wcf 클라이언트가 바인딩과 일치시켜 레거시 끝점을 사용할 수도 있습니다. –

+0

'msmqIntegrationBinding'을 사용할 때 왜 메타 데이터가 거의 없는지 아십니까? 나는 내가 사용할 수있는 방법으로 서비스 프록시를 필요로하지 않는다는 것을 안다. 그러나 데이터 계약은 얻는 것이 좋을 것이다. 어떤 아이디어? –