BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

August 2008 - Posts

[WCF] Ottenere una notifica alla ricezione di un messaggio

In questo articolo pubblicato qualche tempo fa ho introdotto l'utilizzo dei behaviors in WCF. Partendo dai concetti esposti possiamo costruire un semplice behavior che, sempre tramite un MessageInspector, intercetta l'arrivo di un messaggio e genera un evento che l'host può intercettare.

Il message inspector si occupa quindi di generare l'evento:

1 public class RaiseMessageEvent : IDispatchMessageInspector 2 { 3 public event EventHandler<MessageNotifierEventArgs> OnMessageReceiving; 4 5 public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 6 { 7 if (this.OnMessageReceiving != null) 8 { 9 this.OnMessageReceiving(this, new MessageNotifierEventArgs(CreateCopy(ref request))); 10 } 11 return null; 12 } 13 14 public void BeforeSendReply(ref Message reply, object correlationState) 15 { 16 } 17 18 private Message CreateCopy(ref Message message) 19 { 20 MessageBuffer buffer = message.CreateBufferedCopy(int.MaxValue); 21 message = buffer.CreateMessage(); 22 return buffer.CreateMessage(); 23 } 24 }

il MessageNotifierEventArgs ci consente di passare al gestore dell'evento il messaggio ricevuto:

1 public class MessageNotifierEventArgs : EventArgs 2 { 3 private Message message; 4 5 public Message Message 6 { 7 get { return this.message; } 8 set { this.message = value; } 9 } 10 11 public MessageNotifierEventArgs(Message message) 12 { 13 this.message = message; 14 } 15 }

Il behavior, a questo punto, si occupa di creare creare l'istanza del MessageInspector (per brevità ho omesso l'implementazione completa dell'IContractBehavior):

1 public class RaiseMessageEventBehavior : IContractBehavior 2 { 3 RaiseMessageEvent messageHandler = null; 4 5 public RaiseMessageEventBehavior(RaiseMessageEvent messageHandler) 6 { 7 this.messageHandler = messageHandler; 8 } 9 10 public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatchRuntime) 11 { 12 dispatchRuntime.MessageInspectors.Add(this.messageHandler); 13 } 14 }

La scelta del IContractBehavior è dettata semplicemente dalla possibilità di gestire il behavior a livello di contratto e quindi eventualmente anche lato client (non implementata in questo esempio). Ma anche le altre tipologie di behaviors sono tranquillamente utilizzabili.

Ora creiamo il nostro host ed utilizziamo il behavior appena creato:

1 using (ServiceHost host = new ServiceHost(typeof(MyService))) 2 { 3 // Creazione del behavior 4 RaiseMessageEvent messageEvents = new RaiseMessageEvent(); 5 messageEvents.OnMessageReceiving += new EventHandler<MessageNotifierEventArgs>(messageEvents_OnMessageReceiving); 6 7 // Creazione dell'endpoint del servizio 8 ServiceEndpoint endpoint = 9 host.AddServiceEndpoint(typeof(IMyService), 10 new BasicHttpBinding(), 11 "http://localhost:9001/MyService"); 12 endpoint.Contract.Behaviors.Add(new RaiseMessageEventBehavior(messageEvents)); 13 14 host.Open(); 15 16 Console.WriteLine("Host aperto."); 17 Console.ReadLine(); 18 19 host.Close(); 20 }

L'host potrà ora intercettare l'evento MessageReceiving generato ad ogni ricezione di un messaggio:

1 static void messageEvents_OnMessageReceiving(object sender, MessageNotifierEventArgs e) 2 { 3 Console.WriteLine("Message received"); 4 Console.WriteLine(e.Message.ToString()); 5 }

Il servizio MyService è chiaramente di esempio ed è inutile mostrarne l'implementazione, ma è importante valutare la flessibilità che i behaviors consentono di avere e la relativa semplicità di utilizzo e di implementazione.

Good Service

bye

Posted: Aug 29 2008, 08:06 PM by Fabio.Cozzolino | with no comments
Filed under:
[WCF] Ottenere l'IP del client

L'operazione, apparentemente semplice, non era implementata con la prima versione di WCF. Questo perchè, data la varietà di protocolli con cui WCF ha a che fare e dato l'elevato numero di scenari gestibili, non è sempre possibile ottenere l'IP del client.

Con il Service Pack 1 della versione 3.5 e della versione 3.0 del .NET Framework è stata introdotta la classe RemoteEndpointMessageProperty:

1 RemoteEndpointMessageProperty endpointProperty = 2 OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] 3 as RemoteEndpointMessageProperty; 4 5 string clientIP = endpointProperty.Address; 6 string clientPort = endpointProperty.Port;

Bisogna comunque fare attenzione. La proprietà non è disponibile nei messaggi ricevuti su protocolli MSMQ o named pipes (nel cui caso l'IP è sempre quello locale). Per completezza riporto da MSDN:

The property is not present on messages received through either a named pipes or MSMQ transport.

Availability of the property when using HTTP hosted in IIS depends on having a currently active request.  Therefore, this property is not available after the request has completed, such as when performing a one-way receive.

The IP address and port number are that of the node from which the message was received. If a message goes through a relay or proxy, the IP address and port number of the respective relay or proxy is the one attached to the message by this property.

Be aware that the IP address and port could be spoofed by an attacker and thus should not be relied upon for security sensitive authentication or authorization unless additional application specific logic is added.

... ma è già qualcosa Big Smile.

.NET Reflector cambia "casa"

E' indubbiamente il tool per .NET più utilizzato. Lutz Roeder ha fatto un lavoro decisamente superlativo ma, come dice lui stesso, è arrivato il momento di cambiare. Ed ecco che da qualche giorno il software è passato nelle mani di Red Gate che si occuperà di sviluppare le prossime versioni mantenendo comunque una versione free per le community.

E' evidente (e naturale) che questo significa che ci saranno versioni di .NET Reflector a pagamento ... purtroppo.

Voglio ringraziare Lutz Roeder per il lavoro che ha fatto che, vi assicuro, mi ha aiutato nella soluzione di numerosi "casi strani" Big Smile.

Buon lavoro Red Gate.

Posted: Aug 27 2008, 08:45 AM by Fabio.Cozzolino | with no comments
Filed under:
Nuova versione di dotnetside.org

Da qualche giorno, come avrete notato, è online la nuova versione del sito dotnetside.org su Community Server 2008. Dopo varie peripezie finalmente sono riuscito a metterla su ma purtroppo non senza problemi. E' una prima versione ed il passaggio dalla precedente non è stato affatto facile. Stiamo pian piano risolvendo le varie problematiche e cercheremo di farlo nel più breve tempo possibile.

Segnalateci pertanto qualsiasi anomalia o suggerimento direttamente all'indirizzo info@dotnetside.org.

Grazie.

La SP1 è vicina. Mooolto vicina.

Almeno così dicono.

Complimenti a Igor ...

... per la sua ultima pubblicazione !!!

fonte: http://blogs.devleap.com/igor/archive/2008/08/03/k2-blackpearl-the-book.aspx