Pregunta

Tengo una aplicación BizTalk 2006 que tiene un puerto de envío que utiliza MSMQ.

También tengo una aplicación de alojamiento WCF winforms con varios servicios WCF (en el entorno de desarrollo, en producción uso un servicio de Windows como alojamiento).

Uno de los servicios WCF que creé tiene MSMQIntegrationBinding (debido a que BizTalk no es un servicio WCF, por lo que NetMSMQBinding no es posible).

Veo que el mensaje está colocado correctamente en la cola remota porque activé la opción de diario y veo el mensaje en la cola de diario, pero la cola está vacía y el servicio WCF no recoge el mensaje.

¿Alguien puede darme una idea de dónde mirar para resolver este problema?

(edición 1):He investigado un poco más sobre este tema:

  • Al comunicarse con BizTalk 2006 R2 con MSMQ, debe usar MSMQIntegrationBinding porque NetMSMQBinding es solo para WCF a WCF.
  • Entonces estoy atrapado en MSMQIntegrationBinding
  • el enlace MSMQIntegration no utiliza el serializador DataContract.En su lugar, serializa los datos según la propiedad MsmqMessageSerializationFormat.El valor predeterminado es MsmqMessageSerializationFormat.Xml, lo que significa que se utilizará XmlSerializer.La razón detrás de esto es que el transporte de integración msmq está diseñado específicamente para interoperar con aplicaciones nativas MSMQ/System.Messaging.
  • Debido a que el enlace MSMQIntegration usa el antiguo XmlSerializer, no tengo la capacidad fácil de usar svcutil.exe para generar mis clases de datos.Así que tengo que crear mis clases de contrato de datos a mano....pffffffffff

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

(edición 2):

Verifiqué los datos de seguimiento de diagnóstico del servicio WCF y el mensaje desapareció debido a una excepción de deserialización.La única solución ahora es crear la clase de contrato de datos a mano...

(edición 3):Al usar la herramienta xsd.exe en lugar de svcutil.exe, creé la clase de contrato de datos, por lo que no hay trabajo artesanal aquí ;-) Entonces, la conclusión es usar xsd.exe para las clases de contrato de datos que se usan como parámetro en el método de servicio WCF. .Esto se debe a que MSMQIntegrationBinding le obliga a hacer que todos los tipos de contratos de datos sean serializables con XMLSerializer en lugar del DataContractSerializer predeterminado.

¿Fue útil?

Solución

Es posible que desee probar que permite WCF Tracing.

Puede ayudarle a entender lo que está pasando, y lo que no está sucediendo.

El siguiente es un ejemplo .config para habilitar el seguimiento. Asegúrese de que el archivo .config se encuentra en la misma carpeta de su host de servicio 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 proporciona un Herramienta de servicio visor de seguimiento para leer archivos .svclog.

Asegúrese de que la ruta de acceso en initializeData puede ser escrito por su servicio.

Otros consejos

La primera cosa a comprobar aquí es los derechos del servicio WCF. Es la conexión a la cola de mensajes está haciendo por una cuenta que se le permite conectarse a la cola de mensajes.

También puede ser debido a un error de configuración, es su configuración de conexión correcta?

Compruebe el registro de eventos, puede haber un error allí, que te orientará en la dirección correcta.

¿ha comprobado si el mensaje es de hecho dejó en la cola por el servicio WCF, o se trata de ser recogido y eliminado y no procesada por WCF?

Algo que iba a tratar es unir un controlador a la UnknownMessageReceived evento en la instancia ServiceHost y ver si se está activa cuando el mensaje está siendo recogido ... que sería una señal de que su contrato de servicio se define de forma incorrecta (que podría ser necesita usar un retén todo:

[OperationContract(Action="*")]

Para asegurar que obtenga dirigido correctamente a su método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top