Aquí todo el mundo ha hecho un trabajo fantástico en aportar soluciones, y que acaba de terminar luchando contra este problema a mí mismo que quería tirar mi propia 2c y mostrar la solución Se me ocurrió que funciona muy bien.
En primer lugar cuando se crea la cola me aseguro de abrir los permisos como tal (no estoy preocupado por la seguridad de la cola en el contexto de nuestra aplicación ... Esta es una decisión calculada):
queue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Set);
Sin esa línea recibiría todo tipo de errores inaccesibles y ni siquiera podría navegar por la cola desde la pantalla de administración de la computadora.Por cierto, si eso sucede a usted y usted se pregunta cómo matar a la cola que no tiene acceso a solo:
- Detener el servicio "Message Queuing"
- Goto "C: \ Windows \ System32 \ MSMQ \ Storage \ lqs"
- Abrir cada archivo en el bloc de notas y busque el nombre de la cola (lo más probable será el archivo que se ha modificado más recientemente)
- Eliminar el archivo y reinicie el servicio de mensajería
Crear una clase base f o sus elementos de mensaje de cola y márquelo [Serializable]. En caché carga de la aplicación de una lista de todos los tipos de mensajes que utilizan algo como esto:
var types = typeof(QueueItemBase).Assembly
.GetTypes()
.Where(t => typeof(QueueItemBase).IsAssignableFrom(t) && t.IsAbstract == false)
.ToArray();
...
// Create and cache a message formatter instance
_messageFormatter = new XmlMessageFormatter(types);
Ahora ya está listo para empezar a recibir mensajes. Mi primer instinto fue buscar mensajes, pero a la API realmente no le gusta trabajar de esa manera. Así que creo un hilo de fondo y llamo al método de bloqueo Recibir en la cola que volverá una vez que haya un mensaje disponible. A partir de ahí decodificar el mensaje es tan simple como:
var message = queue.Receive();
if (message == null)
continue;
// Tell the message about our formatter containing all our message types before we
// try and deserialise
message.Formatter = _messageFormatter;
var item = message.Body as QueueItemBase;
Y eso debería ser todo lo que necesita para bien implementado, typesafe integración MSMQ!
¡Perfecto! Justo lo que quería. – NLV