2009-12-28 8 views
2

MSMQ를 사용하는 SendPort가있는 BizTalk 2006 앱이 있습니다.MSMQIntegrationBinding이있는 WCF가 큐에서 메시지를 가져 오지 않습니다.

WCF winforms 호스팅 WCF 서비스 (개발 환경에서 프로덕션 환경에서 호스팅으로 Windows 서비스 사용)도 있습니다.

내가 만든 WCF 서비스 중 하나에는 MSMQIntegrationBinding이 있습니다 (BizTalk가 WCF 서비스가 아니기 때문에 NetMSMQBinding을 사용할 수 없음).

업무 일지 옵션을 활성화하고 저널 대기열에 메시지가 표시되지만 대기열이 비어 있고 WCF 서비스가 메시지를 선택하지 않아서 메시지가 원격 대기열에 올바르게 배치 된 것을 확인합니다.

아무도 내게이 문제를 해결하기 위해보아야 할 단서를 줄 수 있습니까?

은 (편집 1) :이 주제에 대해 좀 더 연구를 한 :

  • 당신이 NetMSMQBinding가 아니라 때문에 MSMQIntegrationBinding를 사용해야 R2 MSMQ와 BizTalk 2006와 통신 WCF - 투 - WCF
  • 그래서 MSMQIntegrationBinding에 머물러 있습니다.
  • MSMQIntegration 바인딩은 DataContract serializer를 사용하지 않습니다. 대신 MsmqMessageSerializationFormat 속성을 기반으로 데이터를 serialize합니다. 기본값은 XmlSerializer가 사용됨을 의미하는 MsmqMessageSerializationFormat.Xml입니다. MSMQ 통합 전송은 네이티브 MSMQ/System.Messaging 응용 프로그램과 상호 작용하도록 특별히 설계되었습니다.
  • MSMQIntegration 바인딩은 일반적인 이전 XmlSerializer를 사용하기 때문에 svcutil.exe를 사용하는 쉬운 기능이 없습니다. 내 데이터 클래스를 생성합니다.

    내가 WCF에서 진단 추적 데이터를 확인 :

    (편집 2) : 그래서 .... 손으로 내 datacontract 클래스를 생성

(http://social.msdn.microsoft.com/Forums/en/wcf/thread/2d48fe90-5c2a-4156-8a3f-2e21d5638fa1http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/ 참조) pfffffffffff해야 서비스가 제거되고 deserialize 예외로 인해 메시지가 삭제되었습니다. 유일한 해결책은 이제 손으로 datacontract 클래스를 만드는 것입니다 ...

(편집 3) : svcutil.exe 대신 xsd.exe 도구를 사용하여 datacontract 클래스를 만들었으므로 여기서는 수공 작업을하지 마십시오.) 따라서 결론은 WCF 서비스 메서드에서 매개 변수로 사용되는 데이터 계약 클래스에 xsd.exe를 사용하는 것입니다. MSMQIntegrationBinding은 모든 DataContract 유형을 기본 DataContractSerializer 대신 XMLSerializer와 직렬화 할 수 있도록합니다.

답변

1

당신은 WCF 추적을 가능하게 시도 할 수 있습니다

그것은 당신에게 이해를 도움이 될 수 있습니다. 뭐 일어나고 있고, 일어나지 않고있는 무엇이.

다음은 추적을 사용하는 .config 예제입니다. .config 파일이 WCF 서비스 호스트의 동일한 폴더에 있는지 확인하십시오.

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" switchValue="Warning" 
       propagateActivity="true" > 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 

     <source name="myUserTraceSource" switchValue="Warning, ActivityTracing"> 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 
    </sources> 

    <sharedListeners> 
     <add name="xml" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="C:\trace_logs\TraceLog.svclog" /> 
    </sharedListeners> 

    </system.diagnostics> 
</configuration> 

Microsoft는 Service Trace Viewer Tool을 .svclog 파일을 읽을 수 있도록 제공합니다.

initializeData의 경로가 서비스에서 쓰기 가능하도록 설정되어 있는지 확인하십시오.

+0

Daniel에게 감사드립니다. 이미 알고 있었지만, .config 파일에서 인용했습니다 .--) WCF 로그를보기 위해 활성화 할 것입니다. . –

+0

Daniel, 나는 당신의 대답을 가장 유용하다고 평가했고, 그 해결책은 흔적 정보를 찾는 것으로 easly 발견되었습니다. –

+0

잘 했어, 패트릭. 네가 해결했기 때문에 기쁘다. –

1

여기서 가장 먼저 확인해야 할 것은 WCF 서비스의 권한입니다. 메시지 대기열에 연결할 수있는 계정에서 메시지 대기열에 대한 연결을 수행하고 있습니까?

구성 오류가 원인 일 수 있습니다. 연결 구성이 맞습니까?

이벤트 로그를 확인하면 잘못된 방향으로 향하는 오류가있을 수 있습니다.

+0

이벤트 로그에 오류가 없습니다. 나는 대기열 이름이 서비스 이름과 정확히 일치해야하는지 조사 중입니다 ... –

1

실제로 메시지가 WCF 서비스에 의해 대기열에 남아 있는지 또는 WCF에 의해 메시지가 선택 및 삭제되고 처리되지 않았는지 확인 했습니까?

ServiceHost 인스턴스의 UnknownMessageReceived 이벤트에 처리기를 연결하여 메시지를 가져 왔을 때 트리거되고 있는지 확인하십시오. 서비스 계약이 잘못 정의 된 확실한 신호입니다 (당신이 캐치 모두 사용해야 할 수 있습니다.이 올바르게 방법에 전달됩니다 보장하기 위해

[OperationContract(Action="*")] 

관련 문제