ServiceStack vs ASP.Net Web API [cerrado]
Quiero escribir una nueva API de estilo REST y he mirado ServiceStack y me gusta bastante. Sin embargo, he visto que Microsoft ha lanzado el proyecto ASP.Net Web API como parte de la nueva versión beta de MVC 4. ¿Alguien ha visto el nuevo proyecto de API web? ¿Puedes darnos los pros y los contras de cada sistema?
Tienen casos de uso muy similares; como mantenedor principal del proyecto ServiceStack, tengo una buena idea de las ventajas de ServiceStack y de los muchos beneficios naturales de su diseño basado en mensajes .
ServiceStack existe desde 2008 como un proyecto ejecutado por OSS desde sus inicios con el único objetivo de promover el diseño y la implementación correctos de servicios remotos sin fricciones.
Diseño simple y elegante
En su búsqueda de la máxima simplicidad, está construido alrededor de un núcleo simple y elegante , con la mayoría de sus características vinculadas naturalmente a sus modelos , no a sus controladores, que es lo que hace MVC, WebApi (así como cualquier otro marco de servicio web que Microsoft haya producido). ).
La adopción de un diseño basado en mensajes ofrece un enfoque superior para los servicios remotos, ya que promueven servicios más extensibles y menos frágiles, simplifican los patrones de acceso y llamadas y contienen muchos otros beneficios naturales que se obtienen de forma gratuita .
Como misión principal, luchamos contra la complejidad en cada etapa, con el objetivo de mantener una API invisible y no intrusiva y evitar introducir nuevos conceptos o construcciones artificiales que no sean familiares para .NET o los desarrolladores de servicios web actuales.
Como ejemplo, IService<T>
la implementación de su servicio es solo una clase C# estándar con dependencias cableadas automáticamente. Se utilizan contenedores delgados y livianos para proporcionar una API consistente y unificada en torno a los tipos principales IHttpRequest e IHttpResponse en tiempo de ejecución . También permiten el acceso a las clases de solicitud y respuesta de ASP.NET o HttpListener subyacentes, por lo que nunca estará restringido al usar ServiceStack.
En contraste con WCF y WebApi
A continuación se ofrece una breve descripción general de los estilos de API contrastantes que promueven ServiceStack y WCF . WebApi se diferencia de WCF en que fomenta el diseño de API REST. En cuanto a los ejemplos entre los 2, este es el único ejemplo conocido que tengo con el mismo servicio escrito tanto en ServiceStack como en WebApi .
Mejores prácticas de servicios remotos
ServiceStack se centra principalmente en la simplicidad, el rendimiento y la promoción de las mejores prácticas de servicios web/remotos centradas en adoptar los patrones de diseño de servicios remotos de Martin Fowlers en C# lo más idiomático posible:
El patrón de fachada : sugiere el uso de interfaces de grano grueso por lotes cuando se comunica a través de los límites del proceso.
El patrón DTO ( MSDN ): dicta el uso de POCO de propósito especial para generar el formato de cable de las respuestas de sus servicios web.
El patrón de puerta de enlace ( MSDN ) para encapsular las comunicaciones de cliente y servidor entre los modelos Client Gateway/DTO y los niveles de interfaz de servicio.
Estos patrones garantizan una separación clara de las preocupaciones y una experiencia de desarrollo iterativa sin fricciones.
Potenciando sus servicios
Un servicio web ServiceStack en su esencia se centra en una IService<T>
interfaz C# pura, libre de dependencias y con cableado automático que le brinda total libertad para definir su contrato de servicio web con sus propios DTO de solicitud y respuesta utilizando POCO limpios, lo que hace que la API de ServiceStack sea prácticamente invisible y no -invasivo, es decir, es trivial extraer la lógica de los servicios de C# y ejecutarla fuera de un host ServiceStack.
Esta esencia es un buen ejemplo de lo que se obtiene con solo 1 clase C# .cs en ServiceStack :
- Páginas de metadatos para todos los formatos registrados
- Con enlaces a ejemplos de clientes WSDL, XSD y C#
- Vista de informe HTML amigable para los humanos
- Una única instantánea de página HTML independiente (es decir, sin referencias externas). Incluye respuesta de servicio web JSON integrada: permite el acceso programático a instantáneas de datos.
- Mini Profiler incorporado (puerto del excelente MVC Mini Profiler )
- Incluye perfilado SQL
- Puntos finales JSON/JSONP, XML, JSV, CSV y SOAP
Las clases RestServiceBase y ServiceBase están destinadas a alojar su lógica C# personalizada para lograr la máxima reutilización posible; por ejemplo, su diseño DTO permite de manera trivial la ejecución diferida y proxy donde su mismo servicio C# también puede alojarse y ejecutarse en un host MQ. que es lo que sucede cuando registra un hostIMessageService
como RedisMQ y llama a su servicio a través del punto final (es decir, en clientes C#)/asynconeway
client.SendOneWay()
También puede delegar y crear fácilmente servicios compuestos utilizando el base.ResolveService<T>()
método que devuelve una instancia cableada automáticamente del servicio seleccionado, como se ve en el ejemplo del servicio Nortwind CustomerDetails :
var ordersService = base.ResolveService<OrdersService>();
var ordersResponse = (OrdersResponse)ordersService.Get(
new Orders { CustomerId = customer.Id });
Devolver objetos simples de C#
En su mayor parte, ServiceStack serializará la mayoría de los objetos C# como se esperaba; aquí hay una lista de posibles tipos de devolución ( de esta respuesta ):
- Cualquier objeto DTO -> serializado a Response ContentType
- HttpResult, HttpError, CompressedResult (IHttpResult) para respuesta HTTP personalizada
Los siguientes tipos no se convierten y se escriben directamente en el flujo de respuesta:
- Cadena
- Arroyo
- IStreamWriter
- byte[] - con el tipo de contenido aplicación/flujo de octeto.
Se puede ver un ejemplo de compatibilidad con encabezados HTTP personalizados en este ejemplo de CORS , donde puede configurar encabezados HTTP globalmente o por servicio.
Soporte HTML
Hay múltiples opciones para devolver HTML en ServiceStack que se explican en detalle aquí .
Incluye serializadores binarios y de texto más rápidos para .NET
Los serializadores rápidos y resistentes son de primordial importancia en una API para garantizar tiempos de respuesta rápidos y una API versionable que no interrumpa a los clientes existentes, por lo que ServiceStack incluye los serializadores de texto más rápidos para .NET con una opción NuGet para habilitar el protocolo @marcgravell . Buffers (el serializador binario más rápido de .NET).
Los serializadores de texto de ServiceStack son muy resistentes y pueden soportar versiones extremas sin errores.
Experiencia de desarrollo sin fricciones de principio a fin
La naturaleza obstinada de ServiceStack permite una API de servicio web rápida, escrita y concisa de extremo a extremo con soporte integrado para clientes Sync/Async C#/.NET y Async Silverlight sin ninguna generación de código:
Ejemplo de sincronización C#
var response = client.Send<HelloResponse>(new Hello { Name = "World!" });
Ejemplo de C# asíncrono
client.SendAsync<HelloResponse>(new Hello { Name = "World!" },
r => Console.WriteLine(r.Result), (r, ex) => { throw ex; });
Como simplemente devuelve JSON puro, también se consume trivialmente con otros clientes HTTP, por ejemplo, el ejemplo de cliente JS que usa jQuery :
$.getJSON("http://localhost/Backbone.Todo/todos", function(todos) {
alert(todos.length == 1);
});
Altamente comprobable
Todos los clientes de servicio C#/.NET comparten las mismas interfaces, lo que los hace altamente comprobables e intercambiables hasta el punto en que puede hacer que la misma prueba unitaria también sirva como prueba de integración XML, JSON, JSV y SOAP .
Validación enriquecida y manejo de errores integrados
En su misión de proporcionar una experiencia de desarrollo limpia y sin fricciones, ServiceStack también incluye validación escrita y manejo de errores integrados, donde lanzar una excepción C# o usar su validación Fluent incorporada proporciona a los clientes errores estructurados y escritos fácilmente accesibles en clientes de servicios web. , p.ej:
try {
var client = new JsonServiceClient(BaseUri);
var response = client.Send<UserResponse>(new User());
} catch (WebServiceException webEx) {
/*
webEx.StatusCode = 400
webEx.ErrorCode = ArgumentNullException
webEx.Message = Value cannot be null. Parameter name: Name
webEx.StackTrace = (your Server Exception StackTrace - if DebugMode is enabled)
webEx.ResponseDto = (your populated Response DTO)
webEx.ResponseStatus = (your populated Response Status DTO)
webEx.GetFieldErrors() = (individual errors for each field if any)
*/
}
Para que sea trivial consumir errores en JavaScript, puede usar la biblioteca liviana de JavaScript ss-validation.js para vincular trivialmente sus errores de respuesta a los campos de su formulario HTML con una sola línea de código. El proyecto de ejemplo SocialBootstrapApi proporciona una buena demostración de esto.
Amplia integración con ASP.NET y MVC
ServiceStack MVC PowerPack reescribe y soluciona muchos de los problemas de ASP.NET y MVC con reemplazos para sus agobiantes proveedores de ASP.NET cargados de XML de sesión y almacenamiento en caché con su propia implementación limpia y libre de dependencias de las API ICacheClient e ISession.
ServiceStack también incluye un modelo de proveedor de autenticación y autorización más nuevo y limpio con varios AuthProviders diferentes incorporados:
- Credenciales: para autenticarse con credenciales de nombre de usuario/contraseña publicando en el servicio /auth/credentials
- Autenticación básica: permitir a los usuarios autenticarse con autenticación básica
- Twitter OAuth: permite a los usuarios registrarse y autenticarse con Twitter
- Facebook OAuth: permite a los usuarios registrarse y autenticarse con Facebook
El módulo de autenticación es completamente opcional y está integrado en las API limpias de ICacheClient/ISession y OrmLite, lo que permite que sus sesiones se almacenen en la memoria, Redis o Memcached y que su información de UserAuth persista en los RDBMS compatibles con OrmLite de SQLServer, MySql, PostgreSQL, Sqlite como así como el almacén de datos de Redis o InMemory (útil para desarrollo/pruebas).
Gran documentación
ServiceStack está muy bien documentado y la mayor parte de la información sobre el marco está alojada en la wiki de GitHub . La documentación para otras partes del marco (por ejemplo, Serializadores, Redis, OrmLite) se puede encontrar en servicestack.net/docs/
El proyecto ServiceStack.Examples proporciona el código fuente para todas las demostraciones en vivo y las plantillas de inicio de ServiceStack, mientras que el proyecto SocialBoostsrapApi proporciona un excelente punto de partida para desarrollar una aplicación de página única Backbone.js con ServiceStack y MVC basada en la plantilla Twitters Bootstrap.
Además de lo anterior, el Grupo Google contiene un tesoro de información que se ha expandido considerablemente en los últimos años.
Corre por todas partes
ServiceStack es un marco .NET 3.5 que se ejecuta en hosts ASP.NET y HttpListener y puede alojarse en .NET o Mono (trivia: www.servicestack.net funciona con CentOS/Mono). Esto permite que sus servicios web ServiceStack se alojen en:
Windows con .NET 3.5 y 4.0
- IIS 5/6/7 (usa IHttpHandler)
- Servidor WebDev VS.NET
- Aplicación de consola o GUI de Windows
- Servicio de Windows
Linux/OSX con Mono
- Apache + mod_mono
- Nginx + MonoFastCGI
- XSP
- Aplicación de consola
Desarrollado con el modelo de desarrollo Open Source
ServiceStack cree firmemente en el modelo de desarrollo de código abierto, en el que se desarrolla activamente de forma abierta y siempre ha estado alojado bajo una licencia OSS liberal (Nuevo BSD) desde sus inicios. Hasta el día de hoy ha recibido contribuciones de más de 47 desarrolladores y actualmente se encuentra en el tercer proyecto de C# más visto en GitHub .
Desventajas
Creo que la mayor desventaja es la misma para la mayoría de los demás proyectos OSS .NET en los que Microsoft no lo desarrolló (ni siquiera lo incluyó como una opción disponible). Esto significa que rara vez es la primera opción al evaluar un marco. La mayoría de los usuarios solo evaluarán ServiceStack como último recurso, ya que se sienten frustrados con la fricción impuesta y la fragilidad de WCF o con el rendimiento del Microsoft Stack preferido.
Comentarios y recursos comunitarios
ServiceStack ha sido muy bien recibido con comentarios positivos proporcionados por la mayoría de las personas que lo han evaluado como visible por el sentimiento positivo en el grupo de correo . A partir de este año, la cuenta de Twitter @ServiceStack ha estado rastreando menciones y comentarios en sus favoritos .
La página wiki de Recursos de la comunidad es un buen lugar para obtener más información sobre ServiceStack en la naturaleza con enlaces a publicaciones de blog, podcasts, presentaciones, esencias y más.
Hay una nueva diferencia principal que debe tenerse en cuenta: ServiceStack ya no es de uso gratuito a partir de la versión 4. Dado que hay una respuesta bastante definitiva sobre los profesionales de SS, quería descartar un par para Web API
API web
Pros:
- Gratis para usar en su proyecto (siempre que tenga una licencia VS que permita el uso comercial)
- Nivel extraordinariamente alto de soporte gratuito disponible en Microsoft y en toda la web, incluido aquí en StackOverflow.com.
- Se integra rápidamente con otras pilas de tecnología de Microsoft como ASP.NET MVC, que es extremadamente popular en las tiendas de Microsoft.
- Soporte integrado para autenticación y autorización RESTful en su pila de Microsoft
Contras :
- No es compatible con SOAP
Beneficios auxiliares
(No dude en dejar comentarios a continuación para explicar por qué la API web tiene ventajas o ventajas o desventajas que puedo agregar)
Realmente no puedo decir mucho sobre ServiceStack, pero Web API tiene muchas características excelentes y actualmente se encuentra en la versión 2.
Algunas de las cosas que puedes hacer con Web API:
- Autohospedado en una aplicación OWIN (es decir, se ejecuta en cualquier lugar).
- Soporte total para
async
yawait
. - Buenas plantillas predeterminadas y toneladas de ejemplos de código abierto.
- Se utilizó un gran serializador Json.Net JSON.
- Rest-ish de forma predeterminada (tendrás que hacer hipermedia tú mismo).
- y más...
Como cliente de ServiceStack, este es el profesional de ServiceStack más importante para mí.
https://github.com/ServiceStack/Issues/issues/606
Entonces. Error encontrado, error identificado, error solucionado. Mismo día. ¡Apoyo extraordinario!
Hace un año que uso SS y todo genial. ORMLite es pura magia. Pude reasignar una terrible base de datos MySQL para integrarla en aplicaciones móviles. No hay cambios en la base de datos porque se usa con un backend php con otras aplicaciones...
Mythz es un ejemplo de apoyo y explicación. Mejoró mis conocimientos sobre diseño de aplicaciones y simplicidad de mantenimiento. Pruébalo y lo entenderás.
Además, no compare SS con WebAPI. No es suficiente, SS aporta mucho más a su caja de herramientas. ServiceStack.Text también es un excelente Automapper.