4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>
WCF Syndication
Sempre nel nuovo namespace System.ServiceModel.Web sono presenti nuove classi per rappresentare ad oggetti i feed, con categorie, elementi, persone e link. Lo scopo di queste classi è di permettere di lavorare in modo astratto per poi serializzarle in XML mediante i SyndicationFeedFormatter. In WCF 3.5 ne sono presenti due: Rss20FeedFormatter e Atom10FeedFormatter. Come i nomi suggeriscono, sono classi che serializzano in XML secondo le specifiche RSS 2.0 e Atom 1.0.
Ovviamente queste API possono essere usate a proprio piacimento per caricare, manipolare ed emettere feed, ma si sposano bene con WCF, poiché essendo marcate con DataContractAttribute e implementando IXmlSerializable possono essere restituite da un servizio WCF in unione, eventualmente, a chiamate REST.
Un servizio per la restituzione di un blog di un ipotetico forum può essere quindi così definito:
[ServiceContract]
public interface IASPItaliaBlog {
[OperationContract]
[WebGet()]
Rss20FeedFormatter GetForumBlog();
}L'implementazione del metodo GetForumBlog è la seguente:
public class ASPItaliaBlogService : IASPItaliaBlog
{
public Rss20FeedFormatter GetForumBlog()
{
// Creo le informazioni principali del feed
SyndicationFeed feed = new SyndicationFeed("ASPItalia.com Forum", "Ultimi post sul Forum", new Uri("http://forum.aspitalia.com"));
feed.Description = new TextSyndicationContent("Ultimi post sul Forum");
feed.Authors.Add(new SyndicationPerson("webmaster@aspitalia.com"));
// Popolo gli item
List<SyndicationItem> items = new List<SyndicationItem>();
SyndicationItem item = new SyndicationItem(
"Problema servizio WCF",
"[contenuto post]",
new Uri("http://forum.aspitalia.com/posts/123"),
"{123}",
DateTime.Now);
items.Add(item);
feed.Items = items;
// Ritorno il formatter RSS 2.0 creato
// sulla base del feed
return new Rss20FeedFormatter(feed);
}
}
Il codice è piuttosto semplice e ben commentato. Essendo un servizio, lo si può eventualmente parametrizzare e restituire il feed in formati diversi, oppure, filtrare gli elementi che lo compongono.
Gli elementi SyndicationFeed, SyndicationCategory, SyndicationItem, SyndicationPerson e SyndicationLink si possono inoltre estendere per includere informazioni aggiuntive: basta sovrascrivere i metodi TryParseElement e WriteElementExtensions per caricare o scrivere l'XML.
Durable Service
In WCF 3.5 è presente la possibilità di persistere i servizi e renderli capaci di mantenersi attivi nel tempo anche se l'host viene riavviato. I Durable Service sono in parte simili alle sessioni di WCF, poiché anch'essi mantengono un ID per rappresentare il contesto di una precisa istanza del servizio, con l'eccezione che la classe stessa viene serializzata e persistita per poi essere recuperata ad ogni nuova chiamata al servizio.
Un Durable Service si crea come è solito fare, mediante quindi interfaccia di definizione del contratto e la sua implementazione. In quest'ultima si aggiunge però un nuovo attributo DurableServiceBehavior per indicare che il servizio può essere persistito. Inoltre ogni metodo deve essere marcato con DurableOperationBehavior per indicare che l'operazione rientra fra le operazioni di persistenza. Queste possono inoltre specificare se l'operazione funge da attivazione del servizio mediante CanCreateInstance o ne chiude il ciclo di vita con CompletesInstance.
Un ipotetico servizio di gestione carrello può quindi essere implementato nel seguente modo:
[DurableServiceBehavior()]
[Serializable]
public class CartService : ICart {
[DurableOperationBehavior(CanCreateInstance = true)]
public void BeginCart() {
}
[DurableOperationBehavior()]
ProductAddResponse Add(ProductAddRequest request) {
...
}
[DurableOperationBehavior()]
ProductDeleteResponse Delete(ProductDeleteRequest request) {
...
}
[DurableOperationBehavior(CompletesInstance = true)]
public void EndCart() {
}
}
Da notare inoltre l'attributo Serializable indispensabile per poter serializzare e persistere l'istanza della classe, permettendo così di poter usare variabili a livello di classe per mantenere informazioni di contesto. L'uso dei Durable Service comporta comunque alcuni vincoli:
- utilizzare binding che supportino il contesto, quali wsHttpContextBinding e netTcpContextBinding;
- il ConcurrencyMode non può essere Multiple e InstanceContextMode dev'essere PerSession;
- non è possibile usare OneWay sulle operazioni con CanCreateInstance a true, poiché non si potrebbe ritornare il context ID.
Definito il servizio occorre configurare l'endPoint con il binding appropriato:
<endpoint address =""
binding="wsHttpContextBinding"
contract="ASPItalia.com.Services.ICart"
behaviorConfiguration="CartBehavior" />
Il behavior prevede, oltre alle comuni configurazioni, di specificare il PersistenceProviderFactory che ha il compito di serializzare e persistere l'istanza del servizio. WCF 3.5 prevede già un provider di nome SqlPersistenceProviderFactory per persistere su un database di SQL Server , del quale è possibile trovare gli script di creazione nella cartella "%windir%\Microsoft.Net\Framework\v3.5\SQL\EN\ ". Ecco una tipica configurazione:
<behavior name="CartBehavior">
<persistenceProvider type="System.ServiceModel.Persistence.SqlPersistenceProviderFactory, System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
connectionStringName="CartServiceStore"
persistenceOperationTimeout = "00:00:10"
lockTimeout="00:01:00"
serializeAsText="true"/>
</behavior>
Anche il client necessita ovviamente del medesimo binding e richiede di gestire il contesto associandolo o meno ad un canale mediante l'interfaccia IContextManager:
// Creo il proxy
CartServiceProxy proxy = ...;
// Nuova istanza del servizio
proxy.BeginCart();
// Recupero il gestore del contesto
IContextManager cm = proxy.InnerChannel.GetProperty<IContextManager>();
// Recupero le informazioni del contesto
// con SetContext posso invece impostarlo
IDictionary<XmlQualifiedName, string> context = cm.GetContext();
// Aggiungo un nuovo prodotto
proxy.Add(new ProductAddRequest());
4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>
Contenuti dell'articolo
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.





Difficoltà

Stampa
Download 


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!
