2009-12-28 3 views
2

J'ai une application BizTalk 2006 qui a un sendport utilisant MSMQ.WCF avec MSMQIntegrationBinding ne pas ramasser un message de la file d'attente

J'ai également une application d'hébergement WCF winforms avec plusieurs services WCF (dans l'environnement de développement, en production, j'utilise un service windows comme hébergement).

L'un des services WCF que j'ai créé a un MSMQIntegrationBinding (en raison du fait que BizTalk n'est pas un service WCF, donc NetMSMQBinding n'est pas possible).

Je vois que le message est correctement placé dans la file d'attente éloignée car j'ai activé l'option de journal et je vois le message dans la file d'attente de journal, mais la file est vide et le service WCF ne capte pas le message.

Quelqu'un peut-il me donner une idée de la façon de résoudre ce problème?

(modifier 1): je l'ai fait quelques recherches sur ce sujet:

  • Lorsque vous communiquez avec BizTalk Server 2006 R2 avec MSMQ, vous devez utiliser MsmqIntegrationBinding parce NetMsmqBinding est seulement pour WCF à WCF
  • Je suis donc bloqué à MSMQIntegrationBinding
  • La liaison MSMQIntegration n'utilise pas le sérialiseur DataContract. Au lieu de cela, il sérialise les données en fonction de la propriété MsmqMessageSerializationFormat. La valeur par défaut est MsmqMessageSerializationFormat.Xml, ce qui signifie que XmlSerializer sera utilisé. La raison derrière cela est que le transport d'intégration msmq est conçu spécifiquement pour interopérer avec les applications MSMQ/System.Messaging natives.
  • Parce que la liaison MSMQIntegration utilise l'ancien XmlSerializer, je n'ai pas la possibilité d'utiliser svcutil.exe pour générer mes classes de données. Donc, je dois créer mes cours DataContract à la main .... pfffffffffff

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

(modifier 2):

J'ai vérifié les données de trace de diagnostic de la WCF service et le message a été abandonné en raison d'une exception de désérialisation. La seule solution maintenant est de créer la classe datacontract à la main ...

(edit 3): en utilisant l'outil xsd.exe au lieu de svcutil.exe j'ai créé la classe datacontract, donc pas de travail artisanal ici; - La conclusion est donc d'utiliser xsd.exe pour les classes de contrat de données utilisées comme paramètre dans la méthode de service WCF. Cela est dû au fait que MSMQIntegrationBinding vous oblige à rendre tous les types de contrat de données comme sérialisables avec XMLSerializer au lieu de DataContractSerializer par défaut.

Répondre

1

vous voudrez peut-être essayer d'activer WCF Tracing

il peut vous aider à comprendre. quelle se passe, et ce qui ne se passe pas.

L'exemple suivant est un exemple .config pour activer le suivi. Assurez-vous que le fichier .config se trouve dans le même dossier de votre hôte de service 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 fournit un Service Trace Viewer Tool pour lire les fichiers .svclog.

Assurez-vous que le chemin dans initializeData est accessible en écriture pour votre service.

+0

merci Daniel, je le savais déjà, mais je l'avais cité dans mon fichier .config ;-) Je l'activerai pour voir le journal WCF . –

+0

Daniel, j'ai attribué votre réponse comme plus utile, la solution a été trouvée facilement en regardant les informations de trace. –

+0

Bravo Patrick. Je suis content que tu l'aies résolu. –

1

La première chose à vérifier ici est les droits du service WCF. La connexion à la file d'attente de messages est-elle effectuée par un compte autorisé à se connecter à la file d'attente de messages?

Cela peut aussi être dû à une erreur de configuration, votre configuration de connexion est-elle correcte?

Vérifiez le journal des événements, il peut y avoir une erreur là-bas, qui vous dirigera dans les bonnes directions.

+0

Il n'y a pas d'erreurs dans le journal des événements. J'étudie si le nom de la file d'attente doit être exactement comme le nom du service ... –

1

Avez-vous vérifié si le message est effectivement laissé dans la file d'attente par le service WCF, ou est-il pris en charge et supprimé et tout simplement pas traité par WCF?Quelque chose que j'essayerais attacher un gestionnaire à l'événement UnknownMessageReceived dans l'instance de ServiceHost et voir si elle est déclenchée quand le message est pris ... ce serait un signe certain que votre contrat de service est incorrectement défini (il pourrait vous être nécessaire d'utiliser un fourre-tout.

[OperationContract(Action="*")] 

Afin qu'elle puisse se correctement dirigé vers votre méthode

Questions connexes