Pergunta

Eu tenho um aplicativo BizTalk 2006 que possui um sendport usando MSMQ.

Eu também tenho um aplicativo de hospedagem WCF winforms com vários serviços WCF (no ambiente de desenvolvimento, na produção eu uso um serviço windows como hospedagem).

Um dos serviços WCF que criei possui um MSMQIntegrationBinding (devido ao fato de o BizTalk não ser um serviço WCF, portanto, o NetMSMQBinding não é possível).

Vejo que a mensagem foi colocada corretamente na fila remota porque ativei a opção de diário e vejo a mensagem na fila de diário, mas a fila está vazia e o serviço WCF não está captando a mensagem.

Alguém pode me dar uma pista de onde procurar para resolver esse problema?

(editar 1):Eu fiz mais algumas pesquisas sobre este tópico:

  • Ao se comunicar com o BizTalk 2006 R2 com MSMQ, você deve usar MSMQIntegrationBinding porque NetMSMQBinding é apenas para WCF para WCF
  • Então, estou preso ao MSMQIntegrationBinding
  • a associação MSMQIntegration não usa o serializador DataContract.Em vez disso, ele serializa os dados com base na propriedade MsmqMessageSerializationFormat.O valor padrão é MsmqMessageSerializationFormat.Xml, o que significa que XmlSerializer será usado.A justificativa por trás disso é que o transporte de integração msmq foi projetado especificamente para interoperar com aplicativos nativos MSMQ/System.Messaging
  • Como a ligação MSMQIntegration usa o antigo XmlSerializer, não tenho a capacidade fácil de usar o svcutil.exe para gerar minhas classes de dados.Então eu tenho que criar minhas classes de contrato de dados manualmente....pfffffffffff

(referência: http://social.msdn.microsoft.com/Forums/en/wcf/thread/2d48fe90-5c2a-4156-8a3f-2e21d5638fa1 e http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/)

(editar 2):

Verifiquei os dados de rastreamento de diagnóstico do serviço WCF e a mensagem foi descartada devido a uma exceção de desserialização.A única solução agora é criar a classe datacontract manualmente...

(editar 3):usando a ferramenta xsd.exe em vez de svcutil.exe eu criei a classe datacontract, então não há trabalho artesanal aqui ;-) Portanto, a conclusão é usar xsd.exe para classes de contrato de dados que são usadas como parâmetro no método de serviço WCF .Isso ocorre porque MSMQIntegrationBinding força você a tornar todos os tipos de datacontract serializáveis ​​com o XMLSerializer em vez do DataContractSerializer padrão.

Foi útil?

Solução

Você pode tentar ativar o rastreamento do WCF.

Pode ajudá-lo a entender o que está acontecendo e o que não está acontecendo.

O seguinte é um .config exemplo para ativar o rastreamento.Certifique-se de que .config está localizado na mesma pasta do host do serviço 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>

A Microsoft fornece um Ferramenta Visualizador de Rastreamento de Serviço para ler arquivos .svclog.

Certifique-se de que o caminho em initializeData é gravável pelo seu serviço.

Outras dicas

A primeira coisa a verificar aqui são os direitos do serviço WCF.A conexão com a fila de mensagens está sendo feita por uma conta que tem permissão para se conectar à fila de mensagens.

Também pode ser devido a um erro de configuração. A configuração da sua conexão está correta?

Verifique o log de eventos, pode haver um erro lá, que indicará a direção certa.

Você verificou se a mensagem realmente foi deixada na fila pelo serviço WCF ou se ela está sendo coletada e excluída e simplesmente não é processada pelo WCF?

Algo que eu tentaria é anexar um manipulador ao Mensagem desconhecida recebida evento na instância ServiceHost e veja se ele está sendo acionado quando a mensagem está sendo captada ...isso seria um sinal claro de que seu contrato de serviço está definido incorretamente (pode ser que você precise usar um pega-tudo:

[OperationContract(Action="*")]

Para garantir que ele seja roteado corretamente para o seu método.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top