Condividi tramite


Servizi Web .NET

Creazione di sevizi Web multipiattaforma con ServiceStack

Le Ngan

Scarica il codice di esempio

Mi piace lavorare con Windows Communication Foundation (WCF) perché non c'è supporto eccellente per il quadro in Visual Studio. Lo trovo piuttosto facile costruire un servizio WCF Web da zero e get it up e in esecuzione nel mio ambiente di sviluppo senza l'installazione di pacchetti ridistribuibili e strumenti aggiuntivi. Mi occuperò di mie esperienze con sviluppo cross-platform qui, così potrebbe essere interessati a questo articolo se le istruzioni seguenti si applicano:

  • Hai già familiarità con WCF e C#.
  • Hai bisogno di creare un servizio Web cross-platform.

Penso che siamo tutti d'accordo che scrivere applicazioni cross-platform è perlomeno un inconveniente, ma a volte inevitabile. Se siete come me — Windows-bound e pesantemente investito in C# — mettendo insieme un servizio Web cross-platform potrebbe comportare significativi overhead. Questo include il tuo amato ambiente informatico Windows per ospitare una completamente diversa la riconfigurazione set di strumenti di sviluppo e di apprendimento forse ancora un altro linguaggio di programmazione. In questo articolo, vi mostrerò come è possibile sfruttare la somiglianza WCF di ServiceStack (un framework open source .NET e resto Mono Web services) per svolgere tale compito senza mai lasciare l'ambiente Microsoft .NET Framework o Visual Studio .

Sui servizi Web

Un tipico servizio Web è prevista come raffigurato Figura 1.

A Typical Web Service Layout
Figura 1 tipica Web Service Layout

Il livello di servizio è dove si definisce l'interfaccia del servizio Web. Questo è lo strato unico con cui deve interagire per utilizzare il servizio Web client.

Il livello di business è solitamente pesante con logica di business, ovviamente. Questo è dove risiede la carne dell'implementazione del servizio Web, mantenendo la tua luce di livello di servizio e concentrandosi sui contratti client/server e comunicazione.

Lo strato di dati si intende per incapsulare l'accesso ai dati e fornire modelli di dati astratto per la manipolazione a livello aziendale.

In questo articolo, mi concentrerò sul livello di servizio.

Chiamate di procedura remota versus dati trasferire oggetti

Alcuni servizi Web prendono l'approccio di Remote Procedure Call (RPC), dove ogni richiesta è stato progettato per assomigliare ad una chiamata di funzione:

public interface IService {
  string DoSomething(int input);
}

L'approccio RPC tende a rendere più sensibili alle ultime modifiche di interfaccia del servizio Web. Ad esempio, nel frammento di codice precedente, se una nuova versione del servizio Web richiede due ingressi dal client per eseguire il metodo DoSomething — o ha bisogno di tornare un altro campo oltre il valore di stringa — un cambiamento drastico per vecchi clienti è inevitabile. Naturalmente, è sempre possibile creare un metodo DoSomething_v2 parallelo per prendere due argomenti di input, ma nel tempo che sarebbe il disordine sul Web servizio di interfaccia e il rischio di confusione dei consumatori, sia vecchi che nuovi.

Definisce le interfacce di servizio Web orientate verso il modello di oggetto di trasferimento dati (DTO) favorisce la saggezza convenzionale. Il codice riportato di seguito viene illustrato come il metodo DoSomething del Web può essere trasformato in base al modello DTO:

public class DoSomethingRequest {
  public int Input { get; set; }
}
public class DoSomethingResponse {
  public string Result { get; set; }
}
public interface IService {
  DoSomethingResponse DoSomething(DoSomethingRequest request);
}

A seguito di questa scuola di pensiero, ogni metodo Web prende una sola richiesta DTO e restituisce una singola risposta DTO. L'idea è che l'aggiunta di nuovi campi per la richiesta di DTO e risposta DTO non romperà vecchi clienti.

Vale la pena notare che le interfacce di servizio sia lo stile RPC e DTO-stile Web sono supportate da WCF, ma ServiceStack supporta solo lo stile DTO. ServiceStack abbraccia il principio dello stile DTO remoto di interfacce di servizio Web, per meno chattiness e più chunkiness nella progettazione di interfaccia del servizio Web. Questa è la chiave per comprendere la ServiceStack, perché il quadro è stato progettato in modo che rafforza il principio.

Che cosa è ServiceStack?

Come accennato, il ServiceStack è un open source, cross-platform Mono Web service framework, e sta guadagnando la popolarità. Servizi Web creati con ServiceStack possono funzionare in ambiente Windows con codice .NET o in ambiente Linux con supporto Mono. I sistemi operativi supportati da Mono includono:

  • Linux
  • Mac OS X, iOS
  • Sun Solaris
  • BSD
  • Microsoft Windows
  • Nintendo Wii
  • Sony PlayStation 3

Per ulteriori informazioni sulle piattaforme supportate da Mono, vedere mono-project.com/Supported_Platforms.

Se piace lavorare con il .NET Framework e WCF e hanno bisogno di distribuire il tuo .NET Web services in un ambiente diverso da Windows, ServiceStack è un'opzione ideale. A causa della somiglianza dei ServiceStack e WCF, la transizione da uno a altro richiede regolazione poco in termini di ambiente di sviluppo e strumenti. Si arriva a continuare a scrivere codice c# all'interno di Visual Studio.

ServiceStack impone remoto Web servizio best-practice, basata sulla convenzione DTO standard per l'interfaccia del servizio Web, mentre WCF lascia a voi liberamente definire un Web service API come vedete la misura. ServiceStack fornisce inoltre un oggetto di stato out-of-the-box di risposta che può essere utilizzato per comporre la risposta DTO, favorendo un sistema di gestione degli errori più semplice e diretto. Anche se questo può essere facilmente implementato con WCF, non è un percorso evidente. Le versioni recenti di ServiceStack inoltre forniscono un meccanismo di gestione degli errori basati su eccezione che è simile a — anche se non come Soph­ticated come — gestione WCF colpa degli errori attraverso contratti di colpa.

Le norme applicate da ServiceStack sono facilmente implementate in WCF con un piccolo extra digitando. Tuttavia, oltre alla portabilità, ServiceStack è una valida opzione per creare un servizio Web RESTful perché stabilisce convenzioni che semplificano l'HTTP URI di routing. Allo stesso tempo, ServiceStack le forze di ogni richiesta di servizio Web per essere implementato in una classe separata, promuovendo una separazione naturale delle preoccupazioni per un modello di servizio RESTful.

ServiceStack offre anche altri vantaggi, come ad esempio la registrazione di out-of-the-box e utilità di convalida dei dati di base. Potete leggere di più su ServiceStack a servicestack. NET.

Questo articolo presuppone che hai dimestichezza con il Framework .NET e WCF. Per illustrare meglio come concetti WCF possono tradurre concetti ServiceStack, avrete prima implementare il livello di servizio in WCF. Poi vi mostrerò come trasformare il servizio Web di WCF in un servizio Web cross-platform porting di un equivalente servizio Web utilizzando ServiceStack.

Creazione di un servizio Web WCF semplice

Per dimostrare come ServiceStack può servire come un sostituto per WCF in un ambiente multipiattaforma, comincerò con un semplice servizio Web WCF.

Il servizio Web è un sistema di bigliettazione banale ristorante chiamato TicketService che implementa il contratto di servizio seguenti:

[ServiceContract]
public interface ITicketService {
  [OperationContract]
  List<Ticket> GetAllTicketsInQueue();
  [OperationContract]
  void QueueTicket(Ticket ticket);
  [OperationContract]
  Ticket PullTicket();
}

Il TicketService permette ai suoi clienti un nuovo biglietto in coda, tirare un biglietto fuori la coda e recuperare un inventario completo di tutti i biglietti attualmente nella coda.

Il servizio Web è costituito da tre progetti di Visual Studio , come mostrato Figura 2(in esecuzione la mia soluzione campione, che può essere scaricato a archive.msdn.microsoft.com/mag201308Services, richiede Visual Studio 2012 con strumenti per gli sviluppatori Web e il .NET Framework 4.5).

WCF Ticket Service Visual Studio Projects
Figura 2 WCF Ticket Service Visual Studio progetti

I tre progetti sono brevemente descritti come segue:

  • Il progetto TicketSystem.ServiceContract è l'interfaccia del servizio in cui è definito.
  • Il progetto TicketSystem.TicketProcessor contiene i dettagli di implementazione della logica di business del servizio Web. Questo progetto non contiene alcun riferimento a WCF.
  • Il progetto WcfServer implementa biglietto­System.ServiceContracts e ospita il Web service in IIS.

Ho anche messo insieme un client WCF per consumare il TicketService. Il client WCF è un'applicazione console che utilizza codice generato dall'aggiunta di un riferimento al servizio WCF per il TicketService per comunicare con il servizio Web tramite SOAP su IIS. Qui è l'implementazione del client console:

static void Main(string[] args) {
  Console.Title = "WCF Console Client";
  using (TicketServiceClient client = new TicketServiceClient()) {
    Ticket[] queuedTickets = client.GetAllTicketsInQueue();
    foreach (Ticket ticket in queuedTickets) {
      PrintTicket(ticket);
    }
  }
}

L'implementazione di codice client serve le informazioni mostrate nel Figura 3.

The WCF Console Client
Figura 3 Console Client WCF

Costruzione di un servizio Web ServiceStack equivalente

Prerequisiti per l'utilizzo con ServiceStackper lavorare con ServiceStack, in primo luogo è necessario scaricare i file ridistribuibili. Il modo più semplice per farlo è attraverso la exten NuGet Visual Studio ­sion che consente di installare e aggiornare strumenti e librerie di terze parti facilmente. È possibile scaricare e installare il client NuGet da nuget.codeplex.com. Dopo aver installato NuGet, si dovrebbe vedere in Visual Studio il menu elementi riportati nel Figura 4.

The NuGet Package Manager Console in Visual Studio
Figura 4 il Console Gestione pacchetti NuGet in Visual Studio

Ora farò un passo passo-passo su come creare un servizio ServiceStack Web che è l'equivalente del servizio WCF Web che ho costruito in precedenza.

In primo luogo, prendiamo l'esempio di servizio Web WCF come punto di partenza. Quindi rimuovere il WcfClient e i progetti di WcfServer dalla soluzione. Questi progetti sono specifici di WCF, e potrai essere sostituiti con progetti compatibili con ServiceStack più tardi.

Nella finestra della Console Gestione pacchetti , selezionare il progetto TicketSystem.ServiceContract. Al prompt dei comandi, digitare "pacchetto di installazione ServiceStack," come mostrato Figura 5.

Installing ServiceStack Redistributables with NuGet Package Manager
Figura 5 l'installazione di componenti ridistribuibili ServiceStack con NuGet Gestione pacchetti

Questo passaggio download i file ridistribuibili ultimi necessari per costruire un servizio Web .NET utilizzando ServiceStack. I file ridistribuibili sono in scena sotto un nome di cartella «Pacchetti» collocati nella cartella radice della soluzione Visual Studio . Inoltre, i riferimenti DLL vengono aggiunti al progetto TicketSystem.ServiceContract. Insieme che è un packages.config file creato nella cartella radice del progetto, fornendo informazioni di versione e runtime per ogni DLL ServiceStack:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="ServiceStack" version="3.9.46" 
    targetFramework="net45" />
  <package id="ServiceStack.Common” version=“3.9.46”
    targetFramework="net45" />
  <package id="ServiceStack.OrmLite.SqlServer" version="3.9.45"
    targetFramework="net45" />
  <package id="ServiceStack.Redis" version="3.9.45"
    targetFramework="net45" />
  <package id="ServiceStack.Text" version="3.9.46"
    targetFramework="net45" />
</packages>

Successivamente, convertire i contratti dati WCF definiti nel progetto TicketSystem.ServiceContract a qualcosa che ServiceStack può capire.

Convertire dati contratti WCF contratti dati ServiceStack WCF utilizza i contratti dati per definire i mezzi di comunicazione tra il client e il server. ServiceStack fa la stessa cosa. WCF richiede che gli attributi appropriati vengono messi su qualsiasi oggetto dati e membro di dati che si desidera serializzare e inviare sul filo; in caso contrario, WCF ignora semplicemente li. Questo è dove ServiceStack e WCF differiscono. ServiceStack sarà serializzare tutti Plain Old CLR oggetti (POCOs) a cui fa riferimento nel contratto di servizio e renderli visibili sul lato client. Di seguito sono WCF e ServiceStack codice rappresentazioni del biglietto stesso dati contratto riferimento nell'interfaccia TicketService.

Ecco il WCF <Ticket> dati contratto:

[DataContract]
public class Ticket {
  [DataMember]
  public int TicketId { get; set; }
  [DataMember]
  public int TableNumber { get; set; }
  [DataMember]
  public int ServerId { get; set; }
  [DataMember]
  public List<Order> Orders { get; set; }
  [DataMember]
  public DateTime Timestamp { get; set; }
}

Qui è il ServiceStack <Ticket> dati contratto:

public class Ticket {
  public int TicketId { get; set; }
  public int TableNumber { get; set; }
  public int ServerId { get; set; }
  public List<Order> Orders { get; set; }
  public DateTime Timestamp { get; set; }
}

La principale differenza tra il servizio­Stack e WCF per quanto riguarda l'interfaccia del servizio è che ServiceStack pone restrizioni aggiuntive sull'interfaccia del servizio. ServiceStack impone che ogni richiesta unica è identificato da un oggetto di richiesta unico, perché non non c'è nessun concetto di un'operazione del servizio Web"" (cioè, nome del metodo) nel mondo di ServiceStack. Questo significa che non è possibile riutilizzare una richiesta DTO attraverso molteplici implementazioni del servizio con ServiceStack. Tutti i contratti di ServiceStack Web servizio operazione sarebbero pari a qualcosa di simile per i seguenti contratti di servizio WCF:

[ServiceContract]
public interface ITicketService {
  [OperationContract]
  List<Ticket> GetAllTicketsInQueue(GetAllTicketsInQueueRequest request);
  [OperationContract]
  void QueueTicket(QueueTicketRequest request);
  [OperationContract]
  Ticket PullTicket(PullTicketRequest request);
}

Il codice precedente non è altro che l'interfaccia del servizio RPC-stile TicketService WCF originale mostrato qui, ma trasformato per abbracciare la convenzione DTO:

[ServiceContract]
public interface ITicketService {
  [OperationContract]
  List<Ticket> GetAllTicketsInQueue();
  [OperationContract]
  void QueueTicket(Ticket ticket);
  [OperationContract]
  Ticket PullTicket();
}

Ecco l'interfaccia del servizio TicketService ServiceStack equivalente:

public class GetAllTicketsInQueueRequest {}
public class QueueTicketRequest {
  public Ticket Ticket { get; set; }
}
public class PullTicketRequest {}
public interface ITicketService {
  List<Ticket> Any(GetAllTicketsInQueueRequest request);
  void Any(QueueTicketRequest request);
  Ticket Any(PullTicketRequest request);
}

ServiceStack supporta diverse azioni, come qualsiasi, Get e Post. Le scelte si fanno qui solo l'impatto delle richieste HTTP. Specificare qualsiasi su una richiesta di servizio Web significa che l'operazione può essere richiamato da sia un HTTP POST e HTTP GET. Questa applicazione semplifica l'implementazione del servizio Web RESTful, che è oltre la portata di questo articolo. Per attivare il servizio ServiceStack Web in un servizio Web RESTful, semplicemente aggiungere URL [Route(...)]  attributi per la dichiarazioni di richiesta del servizio Web.

Creare un servizio ASP.NET ha ospitato ServiceStack Web ora che hai definito per il servizio ServiceStack Web l'interfaccia del servizio Web, è il momento di implementarla e farlo lanciato.

In primo luogo, aggiungere un'applicazione Web vuota ASP.NET . Questo è quanto ho scelto di ospitare il mio servizio ServiceStack Web per comodità. Non è l'unico metodo per l'hosting di un servizio Web costruito su ServiceStack. È anche possibile ospitare un servizio all'interno di un servizio Windows o sotto forma di un'applicazione console in esecuzione in un server Web, o anche indipendente di uno.

Ho chiamato questo progetto Visual Studio ServiceStackServer. È l'equivalente del progetto WcfServer nell'esempio di codice del servizio WCF.

Utilizzare NuGet Gestione pacchetti Console per aggiungere riferimenti ServiceStack a ServiceStackServer, come mostrato Figura 6.

Add ServiceStack Library References to the ServiceStackServer Project
Figura 6 aggiungere riferimenti ServiceStack biblioteca per il progetto ServiceStackServer

Ora hai ciò che è necessario implementare l'interfaccia ITicketService. La classe TicketService deve estendere la ServiceStack.Service­Interface.Service classe fornita dal framework, come questo:

public class TicketService : ServiceStack.ServiceInterface.Service,
  ITicketService {
  public List<Ticket> Any(GetAllTicketsInQueueRequest request) {
    // Implement ...
}
  public void Any(QueueTicketRequest request) {
    // Implement ...
}
  public Ticket Any(PullTicketRequest request) {
    // Implement ...
}
}

Tutto il resto è lo stesso come l'implementazione WCF.

Successivamente, aggiungere una classe di applicazione globale denominato Global. asax per il progetto ServiceStackServer come mostrato Figura 7. Questo è dove si inizializza l'applicazione Web ASP.NET .

Add Global.asax to ServiceStackServer
Figura 7 aggiungere Global. asax per ServiceStackServer

Necessario per ereditare dalla ServiceStack.WebHost.End­punti.AppHostBase classe se si desidera ospitare il servizio di Web all'interno di un'applicazione ASP.NET . Ne è illustrato un esempio nella Figura 8.

Figura 8 l'Hosting di un servizio Web ServiceStack dentro ASP.NET

public class Global : System.Web.HttpApplication {
  public class TicketServiceHost : 
    ServiceStack.WebHost.Endpoints.AppHostBase {
    // Register your Web service with ServiceStack.
public TicketServiceHost()
      : base("Ticket Service", typeof(TicketService).Assembly) {}
    public override void Configure(Funq.Container container) {
      // Register any dependencies your services use here.
}
  }
  protected void Application_Start(object sender, EventArgs e) {
    // Initialize your Web service on startup.
new TicketServiceHost().Init();
  }
}

Se in esecuzione in IIS 7 e versioni successive, l'elemento di configurazione esposto Figura 9 deve essere aggiunto al file Web. config.

Figura 9 il File Web. config per IIS 7 e versioni successive

<configuration>
  <system.web>...</system.web>
  <!--Required for IIS 7 (and above) -->
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <add path="*" name="ServiceStack.Factory"
        type="ServiceStack.WebHost.Endpoints.
ServiceStackHttpHandlerFactory, ServiceStack"
        verb="*" preCondition="integratedMode"
          resourceType="Unspecified"
        allowPathInfo="true" />
    </handlers>
  </system.webServer>
</configuration>

Quando si avvia l'applicazione ServiceStack Web, i contratti di servizio sono elencati come metadati di operazioni, come mostrato Figura 10. Ora il vostro servizio Web è pronto ad accettare le richieste dei client. Nella sezione successiva, ti fornisco alcuni esempi dei consumatori per il servizio ServiceStack Web.


Figura 10 TicketService metadati

ServiceStack built-in client

Il gruppo di sviluppo è molto schietto contro ServiceStack generato codice client del servizio Web, così il framework fornisce un insieme di client di servizi Web incorporati elencati sotto il servizio­Stack.ServiceClient.Web dello spazio dei nomi. Tutti i client incorporati implementano ServiceStack.Service.IServiceClient. Quelli che supportano il resto implementare ServiceStack.Service.IRestClient.

I client disponibili includono:

  • JsonServiceClient
  • JsvServiceClient
  • XmlServiceClient
  • MsgPackServiceClient
  • ProtoBufServiceClient
  • Soap11ServiceClient
  • Soap12ServiceClient

Ognuno supporta un formato di serializzazione/deserializzazione differenti. Il loro uso è intercambiabile perché essi implementa un set di interfacce comuni.

Per mantenere le cose semplici, creare un'applicazione console, chiamata ServiceStackClient, per consumare il vostro biglietto ServiceStack­del servizio utilizzando il JsvServiceClient. Se volete provare un client diverso, basta sostituire il seguente codice JsvServiceClient con uno qualsiasi dei clienti disponibili elencati in precedenza:

static void Main(string[] args) {
  Console.Title = "ServiceStack Console Client";
  using (var client = new JsvServiceClient("http://localhost:30542")) {
    List<Ticket> queuedTickets =
      client.Send<List<Ticket>>(new GetAllTicketsInQueueRequest());
    if (queuedTickets != null) {
      foreach (Ticket ticket in queuedTickets) {
        PrintTicket(ticket);
      }
    }
  }
}

L'applicazione console esegue le seguenti operazioni:

  • Query TicketService per tutti i biglietti nella coda.
  • Stampe fuori i biglietti risultante è tornato dal TicketService.

La console è l'esatto stesso come quello generato dal client WCF, mostrato uscita Figura 3.

Più offerta

Questo articolo ha solo scalfito la superficie su che cosa ServiceStack ha da offrire agli utenti WCF che cercano soluzioni cross-platform. Non ho ha discusso il supporto di ServiceStack per lo streaming, le richieste asincrone e le code di messaggi, ad esempio.

Come potete vedere, alcuni passaggi aggiuntivi sono necessari per costruire un servizio ServiceStack Web rispetto a un servizio Web WCF. Tuttavia, credo che lo sforzo è piuttosto trascurabile per trasformare il livello di servizio di un servizio Web WCF associato a Windows in un servizio ServiceStack Web multipiattaforma. Se fossi andato un percorso diverso in cerca di indipendenza dalla piattaforma, ad esempio, utilizzando un servizio Web Java — lo sforzo e la curva di apprendimento sarebbe stato molto maggiore in confronto.

Tutto sommato, se il servizio Web è destinato ad essere eseguito solo su un sistema operativo Windows, quindi WCF è senza dubbio la soluzione migliore. C'è meno overhead durante la creazione di un servizio WCF Web da zero in ambiente Windows, e non hai ancora un altro terzo ridistribuibile per mantenere e distribuire al sistema di destinazione.

Le Ngan è un senior software engineer lavorando a stretto contatto con WCF, che recentemente ha iniziato a esplorare ServiceStack come una soluzione multi-piattaforma per i servizi Web.

Grazie all'esperto tecnica seguente per la revisione di questo articolo: Andrew Oakley (Microsoft)
Andrew Oakley è un Senior Program Manager sui modelli & squadra di pratiche. Prima di diventare un Program Manager, Andrew trascorse due anni come un Technical Evangelist per la piattaforma .NET e Visual Studio . Il suo progetto attuale si concentra sull'orientamento accesso dati intorno edificio polyglot persistenti sistemi relazionali e archivi dati NoSQL.