BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

February 2007 - Posts

[WCF #04] Un WSDL "personalizzato"

Ho già parlato in un precedente post di come è possibile intervenire per modificare "al volo" il WSDL (Web Service Description Language) generato. Molto spesso, però, in un approccio contract-first, il nostro WSDL è già pronto e non abbiamo bisogno di farlo generare da WCF.

WCF ci viene incontro dandoci la possibilità di indicare l'URL del WSDL utilizzando l'attributo externalMetadataLocation nel tag serviceMetadata:

<behaviors> <serviceBehaviors> <behavior name="MyServiceBehavior"> <serviceMetadata externalMetadataLocation="http://localhost/myservice/contract.wsdl" httpGetEnabled="True"/> </behavior> </serviceBehaviors> </behaviors>

ovviamente i metadati del servizio devono essere resi pubblici impostando a true l'attributo httpGetEnabled.

 

bye

Posted: Feb 28 2007, 11:49 PM by Fabio.Cozzolino | with 2 comment(s)
Filed under:
[WCF #03] Custom ServiceHostFactory in IIS

 

WCF consente di configurare un servizio esclusivamente utilizzando il file di configurazione. E' anche possibile configurare un servizio in maniera del tutto programmatica. Ovviamente entrambe le alternative sono molto comode e si adattano, anche in combinazione tra loro, a differenti scenari.

Quando un servizio è in hosting su IIS, però, l'uso della modalità programmatica non è immediato. Di default viene proposto l'uso del file di configurazione e per questo scopo viene utilizzato il service factory di default. Se proprio abbiamo la necessità di configurare programmaticamente l'host del nostro servizio dobbiamo implementare il nostro service factory ereditando dal ServiceHostFactoryBase.

Questo è un esempio di un custom ServiceHostFactory:

 

public class MyServiceFactory : ServiceHostFactoryBase
{
public override sealed ServiceHostBase CreateServiceHost(string constructorString,
Uri[] baseAddresses)
{
Type serviceType
= Type.GetType(constructorString);
return CreateServiceHost(serviceType, baseAddresses);
}

protected virtual ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost serviceHost
= new ServiceHost(serviceType, baseAddresses);

BasicHttpBinding wsb
= new BasicHttpBinding();
wsb.Security.Mode
= BasicHttpSecurityMode.None;

// modifico le impostazioni

serviceHost.AddServiceEndpoint(
typeof(IMyService), wsb, "");

ServiceMetadataBehavior sm
= new ServiceMetadataBehavior();
serviceHost.Description.Behaviors.Add(sm);
sm.HttpGetEnabled
= true;

return serviceHost;
}
}

Modifichiamo quindi la direttiva del file .svc aggiungendo l'attributo Factory per "istruire" wcf su quale factory utilizzare per istanziare l'host del servizio:

<% @ServiceHost Language=C# Debug="true" Service="MyService" Factory="MyServiceFactory" %>

A questo punto il gioco è fatto ...

Posted: Feb 15 2007, 01:30 AM by Fabio.Cozzolino | with no comments
Filed under:
[OT] Italianità

Oggi ho assistito ad una scena fantastica. Stavo aspettando la mia ragazza quando, in una strada stretta e a senso unico, vedo  arrivare un'auto. Qualche metro davanti a quest'auto un gatto attraversa la strada  .... ovviamente era NERISSIMO !!! A questo punto l'auto inchioda, fa retromarcia, si infila in uno spazio laterale "strettissimo" salendo anche con due ruote sul marciapiede, fa passare le auto che la seguivano, e che ovviamente non si erano accorte di nulla, fa retromarcia e riprende la sua strada come se nulla fosse .... una scena bellissima !!!!

LINQ for C#

Language Integrated Query (LINQ) è un insieme di estensioni che consentono di interrogare nativamente ogni tipo di dato direttamente dalle nostre applicazioni C# o VB.NET. 

Per chi volesse saperne di più su TheServerSide è stata pubblicata una Learning Guide per l'apprendimento di LINQ contenente diversi link a risorse come articoli, webcast, downloads, esempi di codice e community di supporto. Ovviamente il primo step "ideale" sarebbe la lettura delle specifiche ...

[WCF #02] La serializzazione

Windows Communication Foundation utilizza di default un nuovo serializer appositamente introdotto con il .NET Framework 3.0: il DataContractSerializer. La necessità di un nuovo serializer è dettata da una serie di necessità come il versioning, un più ampio supporto agli standard dettati dagli schemi XSD e un maggiore controllo dell'xml generato. Per questi ed altri motivi cui si è scelta questa nuova strada. Non è da escludere che nelle future versioni il DataContractSerializer possa soppiantare completamente l'XmlSerializer, anche se la vedo molto dura.

Fortunatamente, per motivi di compatibilità, è anche possibile continuare ad utilizzare l'XmlSerializer utilizzando l'attributo XmlSerializerFormat.

Riprendendo l'esempio fatto nel precedente post avremo quindi:

[ServiceContract()] [XmlSerializerFormat()] public interface IMyService { [OperationContract] string GetMyName(); }

Bisogna fare attenzione al modo in cui i differnti serializer operano. Il DataContractSerializer serializza gli elementi che vengono esplicitamente marcati con gli appositi attributi. L'XmlSerializer, invece, serializza tutti gli elementi pubblici. L'attributo XmlSerializerFormat può essere utilizzato anche a livello di operation.

Posted: Feb 06 2007, 12:18 AM by Fabio.Cozzolino | with no comments
Filed under:
[WCF #01] Come non iniziare dall'ABC ??

L'avrete sentito centinaia di volte...no?? Allora ci provo io ...

Alla base dell'architettura di Windows Communication Foundation c'è l'ABC:

  • Address
  • Binding
  • Contract

In sostanza un endpoint di un servizio è costituito dall'insieme di questi tre elementi. L'address indica come poter raggiungere il servizio (dove). Il binding indica la modalità con cui un consumer deve comunicare con il servizio (come). Il contract, infine, definisce quello che il servizio può fare (cosa). Se diamo un'occhiata al file di configurazione di un servizio WCF troveremo tutti e tre gli elementi:

 

<system.serviceModel>
<services>
<service name="MyService">
<endpoint address="http://localhost/MyService/MyService.svc"
binding
="basicHttpBinding"
contract
="IMyService" />
</service>
</services>
</system.serviceModel>

Tradotto in codice un contratto altro non è che una interfaccia, come vediamo dall'interfaccia IMyService:

 

[ServiceContract()]
public interface IMyService
{
[OperationContract]
string GetMyName();
}

L'uso degli attributi ServiceContract e OperationContract servono per dichiarare un contratto di servizio WCF. L'implementazione di questa interfaccia è poi il codice che realmente servirà le richieste verso quel determinato endpoint. Esempio:

 

public class MyService : IMyService
{
public string GetMyName()
{
return "Fabio";
}
}

---

Che mondo sarebbe senza comunicazione ...

Posted: Feb 03 2007, 02:36 PM by Fabio.Cozzolino | with 6 comment(s)
Filed under:
[WCF #00] Introduzione a ...

Con questo post inauguro una nuova serie dedicata interamente a WCF. Si tratta di post di varia natura, per lo più con piccoli tips, codice, appunti vari che solitamente non trovano spazio in articoli. Era da un po che ci pensavo ma non trovavo mai il tempo di mettere su il tutto. Oggi, complici 5 minuti di tempo in una mattinata di studio, ho deciso di dare inizio alle danze.

I post non avranno una precisa cadenza, ma sicuramente ce ne sarà almeno uno alla settimana. Se avrete la passione e la pazienza di seguirmi, ma soprattutto di commentare/criticare, cercherò di darvi più input possibili sul mondo WCF.

Vi lascio con una riflessione: "Che mondo sarebbe senza comunicazione..."

Posted: Feb 03 2007, 12:03 PM by Fabio.Cozzolino | with 2 comment(s)
Filed under:
[OT] Mi sento fortunato ...

Mi accodo e sottoscrivo il post di Roberto. Credo di rietrare anche io in questa categoria e perciò mi sento molto fortunato. Negli anni ho imparato che dire quello che si pensa, anche se brutalmente, è senza dubbio il modo migliore. Ho anche imparato che esistono persone con cui puoi permettertelo e persone con cui non puoi. Le prime rientrano nella categoria "amici" e le seconde nella categoria "conoscenti".

Posted: Feb 02 2007, 11:25 AM by Fabio.Cozzolino | with no comments
Filed under: