PDA

View Full Version : WCF e MSMQ


fdfdfdddd
18-03-2009, 17:04
Salve a tutti,

č da qualche giorno sto giocando con WCF e ci sto prendendo anche gusto.

Ora volevo fare qualcosa di pių "istruttivo". In pratica tempo fa ho scritto un servizio di Windows che scodava dei messaggi da un coda MSMQ e li elaborava.

Ho pensato ... scrivo un piccolo client che manda messaggi su questa coda, poi scrivo un servizio WCF che alla richiesta del client (quindi invocando un metodo esposto dal servizio stesso) scoda i messaggi, li impacchetta in un formato definito nel DataContract e tramite la tecnica dei callback al tempo "opportuno" chiama il client e restituisce i dati precedentemente impacchettati.

Ho trovato dei tutorial sulla rete che mi hanno guidato alla scrittura di un client WCF "nativo" per le MSMQ (quindi non faccio uso della classica tecnica di programmazione per le code) e qui di seguito riporto il listato:

DataContract:

[DataContract]
public class ApplicationMessage
{
private string _message = string.Empty;
private DateTime _validUntil;

[DataMember]
public string Message
{
set { _message = value; }
get { return _message; }
}

[DataMember]
public DateTime ValidUntil
{
get { return _validUntil; }
set { _validUntil = value; }
}
}


Ecco il ServiceContract:


[ServiceContractAttribute(Namespace = "http://SendMessage")]
interface ISendMessage
{
[OperationContract(IsOneWay = true)]
void SubmitMessage(MsmqMessage<ApplicationMessage> message);
}


e la classe che m'implementa il metodo del servizio:


class SendMessageClient : ClientBase<ISendMessage>, ISendMessage
{
public void SubmitMessage(MsmqMessage<ApplicationMessage> message)
{
base.Channel.SubmitMessage(message);
}

public void SubmitMessage(ApplicationMessage message)
{
MsmqMessage<ApplicationMessage> msmqMessage = new MsmqMessage<ApplicationMessage>(message);
SubmitMessage(msmqMessage);
}
}


Ed infine l'App.Config


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint
name="SendMessageResponseEndpoint"
address="msmq.formatname:DIRECT=OS:.\private$\gtqueueprivata"
binding="msmqIntegrationBinding"
bindingConfiguration="SendMessageBinding"
contract="TestWCFQueue.ISendMessage">
</endpoint>
</client>
<bindings>
<msmqIntegrationBinding>
<binding name="SendMessageBinding">
<security mode="None" />
</binding>
</msmqIntegrationBinding>
</bindings>
</system.serviceModel>
</configuration>


Mi chiedevo a questo punto: esiste un metodo "nativo" per scodare imessaggi piuttosto che il "canonico"


MessageQueue queue = new MessageQueue(".......");

...
...

messages = queue.GetAllaMessages();

...
...


e magari potete fornirmi esempi e/o link utili?

Grazie 1000 anticipatamente a tutti!