Servicios web .NET

Cómo crear servicios web multiplataforma con ServiceStack

Le Ngan

Descargar el ejemplo de código

Me gusta trabajar con Windows Communication Foundation (WCF) porque hay un apoyo excelente para el marco en Visual Studio.Me resulta bastante fácil crear un servicio Web WCF desde cero y llegar arriba y corriendo en mi entorno de desarrollo sin necesidad de instalar componentes redistribuibles y herramientas adicionales.Analizaré mis experiencias con cross-platform development, así estarás interesado en este artículo si se aplican las siguientes declaraciones:

  • Ya estás familiarizado con WCF y C#.
  • Necesitas crear un servicio Web de cross-platform.

Creo que todos coincidimos que escribir aplicaciones multiplataforma es al menos un inconveniente, pero a veces inevitable.Si eres como yo — Windows-bound e invertido pesadamente en C# — organizando un servicio de Web multiplataforma podría ocasionar gastos significativos.Esto incluye la reconfiguración de su amada entorno informático de Windows para acomodar un diferente conjunto de herramientas de desarrollo y posiblemente aprender otro lenguaje de programación.En este artículo, te voy a mostrar cómo puede aprovechar la semejanza WCF de ServiceStack (un open source .NET y resto de Mono Web services framework) para llevar a cabo dicha tarea sin salir de Visual Studio o el entorno de Microsoft .NET Framework.

Acerca de servicios Web

Un servicio Web típico se pone afuera como se muestra en figura 1.

A Typical Web Service LayoutDiseño de servicio Web típica figura 1

La capa de servicios es donde defines tu interfaz de servicio Web.Esta es la única capa con la que el cliente necesita interactuar para consumir el servicio Web.

La capa de negocio es generalmente pesada con la lógica de negocio, obviamente.Esto es donde reside la carne de su implementación de servicio Web, manteniendo la luz de la capa de servicio y centrándose en contratos de cliente/servidor y comunicación.

La capa de datos está destinada a encapsular el acceso a los datos y proporcionar modelos de datos abstractos para manipulación en la capa de negocio.

En este artículo, podrá enfocar la capa de servicio.

Transferencia de llamadas a procedimientos remotos versus datos objetos

Algunos servicios Web adoptar el enfoque de la llamada a procedimiento remoto (RPC), donde cada solicitud es diseñado para parecerse a una llamada de función:

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

El enfoque RPC tiende a hacer más susceptibles a cambios en la interfaz de romper el servicio Web. Por ejemplo, en el fragmento de código anterior, si una versión posterior del servicio Web requiere dos entradas desde el cliente para ejecutar el método DoSomething — o necesita regresar otro campo además el valor de cadena — un cambio de última hora a antiguos clientes es inevitable. Por supuesto, siempre puede crear un método de DoSomething_v2 paralelo para tomar dos argumentos de entrada, pero con el tiempo que sería tu Web servicio de interfaz y el riesgo de confundir a sus clientes, tanto antiguos como nuevos.

La sabiduría convencional favorece definir interfaces de servicio Web orientadas hacia el modelo de objeto de transferencia de datos (DTO). El código siguiente muestra cómo puede transformarse el método Web algo bajo el modelo 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 raíz de esta escuela de pensamiento, cada método Web toma una sola solicitud DTO y devuelve una sola respuesta DTO. La idea es que el agregar nuevos campos para el DTO de solicitud y respuesta DTO no rompa a clientes antiguos.

Cabe destacar que tanto estilo RPC y DTO-estilo Web interfaces de servicio son compatibles con WCF, pero ServiceStack sólo es compatible con el estilo DTO. ServiceStack abraza el principio del estilo remoto DTO de interfaces de servicio Web, para menos chattiness y más chunkiness en el diseño de interfaz de servicio Web. Esto es clave para entender la ServiceStack, porque el marco está diseñado de una manera que refuerza el principio.

¿Qué es ServiceStack?

Como se ha mencionado, el ServiceStack es un marco de servicio Web de Mono multiplataforma, de código abierto, y está ganando popularidad. Servicios web construidos con ServiceStack pueden funcionar en un entorno Windows con código .NET o en un entorno Linux con la ayuda de Mono. Los sistemas operativos soportados por Mono incluyen:

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

Para más información sobre las plataformas soportadas por Mono, consulte mono-project.com/Supported_Platforms.

Si gusta trabajar con .NET Framework y WCF y necesitan implementar los servicios Web de .NET en un entorno que no sea Windows, ServiceStack es una opción ideal. Debido a la semejanza de ServiceStack y WCF, la transición de una a otra requiere un ajuste pequeño en términos de herramientas y entorno de desarrollo. Puedes seguir escribiendo código C# dentro de Visual Studio.

ServiceStack impone remotos servicio mejores prácticas, basadas en la Convención DTO estándares Web para la interfaz de servicio Web, mientras que WCF deja a definir libremente un API de servicios Web como mejor parezca. ServiceStack también proporciona un objeto de estado out-of-the-box respuesta que puede utilizarse para componer la respuesta DTO, alentando a un esquema de gestión de errores más simplista y directo. Aunque esto puede implementarse fácilmente con WCF, no es una ruta obvia. Las versiones recientes de ServiceStack también proporcionan un mecanismo de control de errores basados en la excepción que es similar a — aunque no como Lince­cráteres como — error WCF basada en la culpa manejo mediante contratos de culpa.

Las normas aplicadas por ServiceStack fácilmente se implementan en WCF con un poco extra escribiendo. Sin embargo, además de portabilidad, ServiceStack es una opción viable para desarrollar un servicio Web RESTful porque establece convenios que simplifican la URI HTTP enrutamiento. Al mismo tiempo, ServiceStack las fuerzas de cada solicitud de servicio Web que se implementa en una clase separada, promoviendo una separación natural de preocupaciones para un modelo de servicio RESTful.

ServiceStack también ofrece otras ventajas, tales como registro de out-of-the-box y herramienta de validación de datos básicos. Puedes leer más sobre ServiceStack en servicestack. neto.

Este artículo asume que usted tiene cierta familiaridad con WCF y .NET Framework. Para mejor demostrar cómo pueden traducir conceptos WCF a conceptos de ServiceStack, primero a implementar la capa de servicios de WCF. Entonces te voy a mostrar cómo transformar el servicio Web WCF en un servicio de Web multiplataforma por portarlo a un servicio Web equivalente utilizando ServiceStack.

Construyendo un servicio WCF Simple Web

Para demostrar cómo ServiceStack puede servir como sustituto de WCF en un entorno multiplataforma, voy a empezar con un simple servicio Web WCF.

El servicio Web es un sistema de ticketing trivial restaurante llamado TicketService que implementa el siguiente contrato de servicio:

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

El TicketService permite a sus clientes un nuevo billete de la coleta, sacar un billete para salir de la cola y recuperar un inventario completo de todos los billetes actualmente en la cola.

El servicio Web se compone de tres proyectos de Visual Studio , como se muestra en figura 2(corriendo mi solución de la muestra, que puede descargarse en archive.msdn.microsoft.com/mag201308Services, requiere Visual Studio 2012 con Web Developer Tools y el .NET Framework 4.5).

WCF Ticket Service Visual Studio ProjectsFigura 2 WCF Ticket Service Visual Studio Projects

Los tres proyectos se describen brevemente a continuación:

  • El proyecto TicketSystem.ServiceContract es donde se define la interfaz de servicio.
  • El proyecto de TicketSystem.TicketProcessor contiene los detalles de implementación de la lógica de negocio de servicio Web.Este proyecto contiene hay referencias a WCF.
  • El proyecto WcfServer implementa Ticket­System.ServiceContracts y hosts de la red de servicio en IIS.

También poner juntos un cliente WCF para consumir el TicketService.El cliente WCF es una aplicación de consola que utiliza el código generado de la adición de una referencia de servicio WCF a la TicketService para comunicarse con el servicio Web utilizando SOAP sobre IIS.Aquí está la aplicación de consola de cliente:

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);
    }
  }
}

Sirve la información mostrada en la implementación del código de cliente figura 3.

The WCF Console Client
Figura 3 el cliente WCF de consola

Construcción de un servicio Web de ServiceStack equivalente

Prerrequisito para trabajar con ServiceStackpara trabajar con ServiceStack, primero debe descargar los redistribuibles. La forma más fácil de hacerlo es a través de la exten NuGet Visual Studio ­sion que permite instalar y actualizar las bibliotecas de terceros y herramientas fácilmente. Usted puede descargar e instalar el cliente de NuGet de nuget.codeplex.com. Una vez instalado NuGet, deberías ver en Visual Studio el menú artículos mostrados en figura 4.

The NuGet Package Manager Console in Visual Studio
Figura 4 la consola de Administrador de paquetes NuGet en Visual Studio

Ahora voy a hacer un tutorial paso a paso sobre cómo crear un servicio ServiceStack Web que es el equivalente del servicio Web WCF que construido previamente.

En primer lugar, tomar el ejemplo de servicio Web WCF como punto de partida. Luego retire la WcfClient y la proyectos de wcfserver de la solución. Estos proyectos son específicos de WCF, y podrá reemplazarse con proyectos compatibles con ServiceStack más tarde.

En la ventana de la consola de Administrador de paquetes , seleccione el proyecto TicketSystem.ServiceContract. En el sistema del símbolo, escriba "install package ServiceStack", como se muestra en la figura 5.

Installing ServiceStack Redistributables with NuGet Package Manager
Figura 5 instalación componentes redistribuibles ServiceStack con NuGet Administrador de paquetes

Este paso descargas los últimos redistribuibles necesarios construir un servicio Web de .NET utilizando ServiceStack. Los redistribuibles se organizaron bajo el nombre de una carpeta "Paquetes" colocados en la carpeta raíz del Visual Studio solución. Además, las referencias de la DLL se agregan al proyecto TicketSystem.ServiceContract. Junto con es un archivo packages.config creado en la carpeta raíz del proyecto, le proporciona información de versión y tiempo de ejecución para cada ServiceStack DLL:

<?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>

A continuación, convertir los contratos de datos WCF definidos en el proyecto TicketSystem.ServiceContract a algo que pueda entender el ServiceStack.

Convertir los contratos de datos de WCF a los contratos de datos ServiceStack WCF utiliza datos contratos para establecer los medios de comunicación entre el cliente y el servidor. ServiceStack hace lo mismo. WCF requiere que los atributos apropiados se ponen en cualquier objeto de datos y el miembro de datos que desea serializar y enviar sobre el alambre; de lo contrario, WCF simplemente los ignora. Esto es donde ServiceStack y WCF difieren. ServiceStack a serializar todos Plain Old CLR objetos (POCOs) se hace referencia en el contrato de servicio y hacerlos visibles para el lado del cliente. Siguiente son WCF y representaciones de código ServiceStack de la misma referencia boleto de contrato de datos en la interfaz TicketService.

Aquí está el WCF <Ticket> contrato de datos:

[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; }
}

Aquí está el ServiceStack <Ticket> contrato de datos:

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 principal diferencia entre servicio­Stack y WCF en cuanto a la interfaz de servicio es que ServiceStack pone restricciones adicionales sobre la interfaz del servicio. ServiceStack dicta que cada petición única es identificado por un objeto de la solicitud única, porque no hay ningún concepto de una operación del servicio Web"" (es decir, el nombre de método) en el mundo de ServiceStack. Esto significa que usted no puede reutilizar una petición DTO a través de múltiples implementaciones de servicio con ServiceStack. Todos los contratos de operación de ServiceStack Web servicio equivaldría a algo similar a los siguientes contratos de servicio WCF:

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

El código anterior es nada más que la interfaz original de servicio de estilo RPC TicketService WCF se muestra aquí, pero transformado para abrazar la Convención DTO:

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

Aquí es la interfaz de servicio equivalente de TicketService ServiceStack:

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 soporta diferentes acciones, como cualquiera, Get y Post. Las opciones que aquí sólo impacto las solicitudes HTTP. Especificar en una solicitud de servicio Web significa que la operación puede ser invocada por un HTTP GET y un POST de HTTP. Esta aplicación simplifica la implementación del servicio Web RESTful, que está más allá del alcance de este artículo. Para activar el servicio ServiceStack Web en un servicio Web RESTful, simplemente añadir URL [Route(...)]  atributos a tus declaraciones de solicitud de servicio Web.

Crear un servicio de la Web ASP.NET Hosted ServiceStack ahora que tienes la interfaz de servicio Web definida para el servicio ServiceStack Web, es hora de aplicarlo y lo lanzó.

En primer lugar, añadir una aplicación Web vacía de ASP.NET . Esto es cómo decidí organizar mi servicio ServiceStack Web para mayor comodidad. De ninguna manera es el único método para hospedar un servicio Web basado en ServiceStack. También podrá celebrar dicho servicio dentro de un servicio de Windows o en la forma de una aplicación de consola que se ejecuta bajo un servidor Web, o incluso independiente de uno.

Se llama este proyecto Visual Studio ServiceStackServer. Es el equivalente del proyecto WcfServer en el ejemplo de código del servicio WCF.

Utilice la consola de Administrador de paquetes NuGet para añadir referencias de ServiceStack a ServiceStackServer como se muestra en figura 6.

Add ServiceStack Library References to the ServiceStackServer Project
Figura 6 Añadir ServiceStack biblioteca referencias al proyecto ServiceStackServer

Ahora tienes lo que necesitas para implementar la interfaz ITicketService. La clase TicketService debe extender la ServiceStack.Service­Interface.Service clase proporcionada por el marco, así:

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 ...
}
}

Todo lo demás es lo mismo que la implementación de WCF.

A continuación, agregue una clase de aplicación Global llamado Global.asax para el proyecto ServiceStackServer como se muestra en la figura 7. Esto es donde inicializar la aplicación Web de ASP.NET .

Add Global.asax to ServiceStackServer
Figura 7 Añadir Global.asax a ServiceStackServer

Es necesario heredar de la ServiceStack.WebHost.End­puntos.Clase de AppHostBase si desea hospedar su servicio Web dentro de una aplicación ASP.NET . Ver figura 8 para un ejemplo.

Figura 8 Hosting un servicio Web ServiceStack dentro de 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();
  }
}

Si ejecuta IIS 7 y más tarde, el elemento de configuración exhibió en figura 9 debe añadirse al archivo Web.config.

Figura 9 el archivo Web.config para IIS 7 y más tarde

<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>

Cuando ejecutas la aplicación ServiceStack Web, los contratos de servicio figuran como las operaciones metadatos, como se muestra en figura 10. Ahora el servicio Web está preparado para aceptar las peticiones del cliente. En la siguiente sección, proporcionaremos algunos ejemplos de consumidor para el servicio ServiceStack Web.


Figura 10 TicketService metadatos

Built-in ServiceStack clientes

El ServiceStack grupo de desarrollo es muy abiertamente contra genera código de cliente de servicios Web, para el marco proporciona un conjunto de clientes de servicios de Web incorporados enumerados bajo el servicio­Stack.ServiceClient.Web espacio de nombres. Todos los clientes incorporados implementan ServiceStack.Service.IServiceClient. Los que apoyan el resto implementan ServiceStack.Service.IRestClient.

Clientes disponibles incluyen:

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

Cada uno admite un formato de serialización/deserialización diferentes. Su uso es intercambiable, porque ellos implementan un conjunto de interfaces comunes.

Para mantener las cosas simples, crear una aplicación de consola llamada ServiceStackClient a consumir su billete de ServiceStack­servicio usando el JsvServiceClient. Si quieres probar un cliente diferente, simplemente reemplace el siguiente código JsvServiceClient con cualquiera de los clientes disponibles anteriormente enumerados:

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);
      }
    }
  }
}

La aplicación de consola hace lo siguiente:

  • Consulta el TicketService para todas las entradas en la cola.
  • Imprime los boletos resultantes que volviera de la TicketService.

La consola de salida es exactamente igual como la generada por el cliente WCF, se muestra en la figura 3.

Más a la oferta

Este artículo sólo arañado la superficie de lo que ServiceStack tiene que ofrecer a los usuarios WCF buscando soluciones multiplataforma. Incluso no lo discutí soporte de ServiceStack para streaming, async peticiones y colas de mensajes, por ejemplo.

Como puedes ver, se requieren pasos adicionales para desarrollar un servicio ServiceStack Web frente a un servicio Web WCF. Sin embargo, creo que el esfuerzo es algo insignificante para transformar la capa de servicio de un servicio Web de WCF Windows enlazado en un servicio de ServiceStack Web multiplataforma. Si hubiera ido una ruta diferente en busca de la independencia de la plataforma — por ejemplo, mediante un servicio Web de Java — el esfuerzo y la curva de aprendizaje habría sido mucho mayores en comparación.

Considerándolo todo, si el servicio Web está destinado a ejecutar solamente de un sistema operativo Windows, luego WCF es posiblemente la mejor solución. Hay menos overhead al crear un servicio Web WCF desde cero en el entorno de Windows, y no tienes otro tercero redistribuible para mantener e implementar el sistema de destino.

Ngan Le es un ingeniero senior de software trabajando en estrecha colaboración con WCF que recientemente empezó a explorar ServiceStack como una solución multiplataforma para servicios Web.

Gracias al siguiente experto técnico por su ayuda en la revisión de este artículo: Andrew Oakley (Microsoft)
Andrew Oakley es un Senior Program Manager en los patrones & equipo de prácticas. Antes de convertirse en un administrador de programas, Andrew pasó dos años como evangelista técnico para Visual Studio y la plataforma .NET. Su proyecto actual se centra en la dirección de acceso de datos alrededor edificio políglotas persistentes sistemas usando relacional y almacenes de datos NoSQL.