API da Web do ServiceStack vs ASP.Net [fechada]

299

Eu quero escrever uma nova API de estilo REST e olhei para o ServiceStack e muito parecido. No entanto, vi que a Microsoft lançou o projeto ASP.Net Web API como parte do novo MVC 4 beta. Alguém já olhou para o novo projeto de API da Web? Você pode dar algum prós / contras de cada sistema?

cavalete
fonte

Respostas:

389

Eles têm casos de uso muito semelhantes, como mantenedor líder do projeto ServiceStack, tenho uma boa visão das vantagens do ServiceStack e dos muitos benefícios naturais de seu design baseado em mensagens .

O ServiceStack existe desde 2008 como um projeto executado por OSS desde o início, com um único objetivo de promover o design e a implementação corretos de serviços remotos sem atrito.

Design Simples e Elegante

Em busca da simplicidade máxima, ele é construído em torno de um núcleo simples e elegante - com a maioria dos recursos vinculando-se naturalmente aos seus modelos , não aos controladores - que é o que o MVC, o WebApi faz (assim como todos os outros Web Service Framework que a Microsoft produziu )

A adoção de um design baseado em mensagens oferece uma abordagem superior para serviços remotos, pois eles promovem serviços mais extensíveis e menos frágeis, simplificam os padrões de acesso e chamada e contêm muitos outros benefícios naturais que você obtém gratuitamente .

Como missão principal, combatemos a complexidade em todas as etapas, com o objetivo de manter uma API invisível e não intrusiva e evitar a introdução de novos conceitos ou construções artificiais que ainda não sejam familiares aos desenvolvedores de .NET ou de serviços da Web atualmente.

Como exemplo, sua IService<T>implementação de serviço é apenas uma classe C # padrão com dependências com fio automáticas. Wrappers finos e leves são usados ​​para fornecer uma API consistente e unificada em torno dos tipos principais de tempo de execução IHttpRequest e IHttpResponse . Eles também permitem o acesso às classes subjacentes de solicitação e resposta do ASP.NET ou HttpListener, para que você nunca fique restrito ao usar o ServiceStack.

Contrastado com o WCF e o WebApi

Aqui está uma breve visão geral dos estilos de API contrastantes que o ServiceStack e o WCF promovem . O WebApi é diferente do WCF, pois incentiva o design da API REST-cheia. Quanto aos exemplos entre os 2, este é o único exemplo conhecido que tenho com o mesmo serviço escrito no ServiceStack e no WebApi .

Serviços remotos de práticas recomendadas

O ServiceStack tem como foco principal a simplicidade, o desempenho e a promoção das práticas recomendadas de serviço web / remoto, centradas na adoção de padrões de design de serviço remoto Martin Fowlers no C # idiomático possível:

  • O padrão de fachada - o que sugere o uso de interfaces granulares e granulares quando você se comunica através dos limites do processo.

  • O padrão DTO ( MSDN ) - Ditando o uso de POCOs para fins especiais para gerar o formato de conexão de suas respostas de serviços da web.

  • O padrão de gateway ( MSDN ) para encapsular as comunicações de cliente e servidor entre os modelos de gateway de cliente / DTO e as camadas da interface de serviço.

Esses padrões garantem uma separação clara de preocupações e uma experiência de desenvolvedor iterativa sem atrito.

Capacitando seus serviços

Um serviço Web ServiceStack em sua essência é centrado em uma IService<T>interface C # pura, livre de dependência e com conexão automática, que oferece total liberdade para definir seu contrato de serviço web com seus próprios DTOs de solicitação e resposta usando POCOs limpos - tornando a API do ServiceStack praticamente invisível e não invasivo, ou seja, é trivial extrair sua lógica de serviços em C # e executá-la fora de um host do ServiceStack.

Esta essência é um bom exemplo do que você obtém com apenas 1 classe C # .cs no ServiceStack :

  • Páginas de metadados para todos os formatos registrados
    • Com links para exemplos de clientes WSDLs, XSDs e C #
  • Visualização de relatório HTML amigável para humanos
    • Um único instantâneo de página html independente (ou seja, sem referências externas). Inclui resposta de serviço da Web JSON incorporada - permite acesso programático a snapshots de dados.
  • Mini Profiler embutido (porta do excelente MVC Mini Profiler )
    • Inclui criação de perfil SQL
  • Pontos de extremidade JSON / JSONP, XML, JSV, CSV e SOAP

As classes RestServiceBase e ServiceBase destinam-se a hospedar sua lógica C # personalizada para o máximo potencial de reutilização possível, por exemplo, seu design DTO primeiro permite trivialmente a execução adiada e em proxy, onde seu mesmo serviço C # também pode ser hospedado e executado em um host MQ que é o que acontece quando você se registra um IMessageServicecomo o anfitrião RedisMQ e chame o serviço através do /asynconewayponto final (ou seja, client.SendOneWay()em C # Clients)

Você também pode delegar e criar facilmente serviços compostos usando o base.ResolveService<T>()método que retorna uma instância com fio automática do serviço selecionado, como visto no exemplo do Serviço Nortwind CustomerDetails :

var ordersService = base.ResolveService<OrdersService>();
var ordersResponse = (OrdersResponse)ordersService.Get(
    new Orders { CustomerId = customer.Id });

Retornar objetos C # simples

Na maioria das vezes, o ServiceStack serializa a maioria dos objetos C # conforme o esperado - aqui está uma lista dos possíveis tipos de retorno ( desta resposta ):

  • Qualquer objeto DTO -> serializado para o ContentType de resposta
  • HttpResult, HttpError, CompressedResult (IHttpResult) para resposta HTTP personalizada

Os seguintes tipos não são convertidos e são gravados diretamente no fluxo de resposta:

  • Corda
  • Corrente
  • IStreamWriter
  • byte [] - com o tipo de conteúdo application / octet-stream.

Um exemplo do suporte a cabeçalhos HTTP personalizados pode ser visto neste exemplo do CORS, em que você pode configurar os cabeçalhos HTTP globalmente ou por serviço.

Suporte HTML

Existem várias opções para retornar HTML no ServiceStack, explicadas em detalhes aqui .

Inclui serializadores de texto e binários mais rápidos para .NET

Serializadores rápidos e resilientes são de importância primordial em uma API para garantir tempos de resposta rápidos e uma API com versão que não interrompa os clientes existentes. Por isso, o ServiceStack inclui os serializadores de texto mais rápidos para .NET com uma opção NuGet para ativar o Protocolo de @marcgravell Buffers (serializador binário mais rápido do .NET).

Os serializadores de texto do ServiceStack são muito resistentes e podem suportar versões extremas sem erros.

Experiência em desenvolvimento sem atrito End-to-End

A natureza opinativa do ServiceStack permite uma API de serviço da Web concisa, rápida e tipada, ponta a ponta, com suporte interno para clientes Sync / Async C # / .NET e Async Silverlight sem nenhum código de geração:

Exemplo de sincronização C #

var response = client.Send<HelloResponse>(new Hello { Name = "World!" });

Exemplo de C # assíncrono

client.SendAsync<HelloResponse>(new Hello { Name = "World!" },
    r => Console.WriteLine(r.Result), (r, ex) => { throw ex; });

Como ele retorna JSON puro, também é consumido trivialmente com outros clientes HTTP, por exemplo, exemplo de cliente JS usando jQuery :

$.getJSON("http://localhost/Backbone.Todo/todos", function(todos) {
    alert(todos.length == 1);
});

Altamente testável

Todos os C # / .NET ServiceClients compartilham as mesmas interfaces que os tornam altamente testáveis e trocáveis ​​até o ponto em que você pode ter o mesmo teste de unidade e também serve como um teste de integração XML, JSON, JSV, SOAP .

Validação avançada e tratamento de erros integrados

Em sua missão de fornecer uma experiência de desenvolvedor limpa e sem fricção, o ServiceStack também inclui validação digitada e tratamento de erros embutidos, onde lançar uma exceção C # ou usar sua validação Fluente incorporada fornece aos clientes erros estruturados e tipados facilmente acessíveis em clientes de serviços da Web , por exemplo:

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 facilitar o consumo de erros no JavaScript, você pode usar a biblioteca JavaScript leve ss-validation.js para vincular trivialmente seus erros de resposta aos campos do formulário HTML com uma única linha de código. O projeto de exemplo SocialBootstrapApi fornece uma boa demonstração disso.

Integração rica com ASP.NET e MVC

O ServiceStack MVC PowerPack reescreve e corrige muitos problemas do ASP.NET e MVC, com substituições para seus provedores de ASP.NET sobrecarregados por Session e Caching XML com cache com sua própria implementação limpa e sem dependência das APIs ICacheClient e ISession.

O ServiceStack também inclui um modelo de provedor de autenticação e autorização mais novo e limpo, com vários AuthProviders diferentes incorporados:

  • Credenciais - Para autenticar com credenciais de nome de usuário / senha, postando no serviço / auth / credentials
  • Autenticação básica - Permitindo que os usuários se autentiquem com a autenticação básica
  • Twitter OAuth - Permite que os usuários se registrem e se autentiquem no Twitter
  • Facebook OAuth - Permite que os usuários se registrem e se autentiquem no Facebook

O módulo Autenticação é totalmente opcional e é integrado às APIs ICacheClient / ISession e OrmLite limpas, que permitem que suas sessões sejam armazenadas na memória, Redis ou Memcached e suas informações de UserAuth persistem nos RDBMSs suportados do OrmLite do SQLServer, MySql, PostgreSQL, Sqlite como RDBMSs suportados do OrmLite. bem como armazenamento de dados Redis ou InMemory (útil para desenvolvimento / teste).

Ótima documentação

O ServiceStack está muito bem documentado, onde a maioria das informações sobre a estrutura está hospedada no wiki do GitHub . A documentação para outras partes da estrutura (por exemplo, Serializers, Redis, OrmLite) pode ser encontrada em servicestack.net/docs/

O projeto ServiceStack.Examples fornece o código-fonte para todas as demos ao vivo e modelos iniciais do ServiceStack, enquanto o projeto SocialBoostsrapApi fornece um excelente ponto de partida para o desenvolvimento de um aplicativo de página única do Backbone.js com ServiceStack e MVC baseado no modelo do Twitters Bootstrap.

Além do exposto acima, há um tesouro de informações no Grupo Google, que se expandiu consideravelmente nos últimos anos.

Corre em todo o lado

O ServiceStack é uma estrutura do .NET 3.5 que roda nos hosts ASP.NET e HttpListener e pode ser hospedada no .NET ou Mono (trivialidade: www.servicestack.net é alimentado por CentOS / Mono). Isso permite que seus serviços web ServiceStack sejam hospedados em:

Windows com .NET 3.5 e 4.0

Linux / OSX com Mono

  • Apache + mod_mono
  • Nginx + MonoFastCGI
  • XSP
  • Console App

Desenvolvido com o modelo de desenvolvimento Open Source

O ServiceStack acredita firmemente no modelo de desenvolvimento de código aberto, onde ele é desenvolvido ativamente em ambiente aberto e sempre foi hospedado sob uma licença OSS liberal (New BSD) desde o seu início. Atualmente, recebeu contribuições de mais de 47 desenvolvedores e atualmente está no terceiro projeto C # mais assistido no GitHub .

Desvantagens

Acredito que a maior desvantagem é a mesma para a maioria dos outros projetos OSS .NET onde não foi desenvolvido (ou mesmo listado como uma opção disponível) pela Microsoft. Isso significa que raramente é a primeira escolha ao avaliar uma estrutura. A maioria dos adotantes avalia apenas o ServiceStack como último recurso, onde fica frustrada com a fricção e fragilidade impostas pelo WCF ou com o desempenho do Microsoft Stack preferido.

Feedback e recursos da comunidade

O ServiceStack foi muito bem recebido com feedback positivo fornecido pela maioria das pessoas que o avaliaram como visível pelo sentimento positivo no grupo de correspondência . A partir deste ano, a conta do Twitter do @ServiceStack acompanhava as menções e comentários nos seus favoritos .

A página da wiki Recursos da comunidade é um bom lugar para descobrir mais sobre o ServiceStack em estado selvagem, com links para postagens de blog, podcasts, apresentações, Gists e muito mais.

mythz
fonte
30
Como alguém que tentou usar o WCF, o webapi e agora o ServiceStack, fique com o ServiceStack. 1) O WCF é desnecessariamente complexo demais para a maioria. É o antigo delima "vamos resolver todos os problemas". 2) web-api é muito novo. Aguarde o lançamento final. Ele nem suporta postagens de formulários de várias partes. O código está em um estado de fluxo. Eu não executaria aplicativos comerciais nele. BTW, esta questão não deve ser encerrada.
Michael Silver
13
Você poderia editar isso para o ASP.NET WebAPI que acabou de ser lançado.
Blake Niemyjski 23/08/2012
26
Torne seu site mais fácil de usar. Parece uma ótima ferramenta. Mas o seu site é confuso. Não está claro qual é o projeto e o que ele pretende solucionar. Por outro lado, esta resposta é fantástica.
Kugel
82
Isso realmente não parece ser uma comparação com a API da Web. Faz sentido - no momento da resposta, a API da Web era totalmente nova. Este não é mais o caso. Eu realmente adoraria ver um colapso real e temo que esta resposta esteja desatualizada.
George Mauer 21/03
35
Vale a pena ressaltar que o ServiceStack está migrando para uma distribuição comercial / somente binária a partir da v4.0. Veja a postagem do Demis no Google+ para obter detalhes.
Nick Jones
137

Há uma nova diferença principal que precisa ser levada em consideração - o ServiceStack não é mais gratuito para uso a partir da v4. Como existe uma resposta bastante definitiva nos profissionais da SS, eu queria lançar algumas para a API da Web

API da Web

Profissionais:

  1. Livre para usar em seu projeto (desde que você tenha uma licença VS que permita o uso comercial)
  2. Nível extraordinariamente alto de suporte gratuito disponível na Microsoft e em toda a web, inclusive aqui no StackOverflow.com.
  3. Integra-se rapidamente a outras pilhas de tecnologia da Microsoft, como o ASP.NET MVC, extremamente popular nas lojas da Microsoft
  4. Suporte integrado para autenticação e autorização RESTful na sua pilha da Microsoft

Contras:

  1. Não suporta SOAP

Benefícios Auxiliares

(Por favor, não hesite em deixar comentários abaixo, explicando por que a API da Web tem benefícios ou tem prós / contras que posso adicionar)

PW Kad
fonte
84
Não tenho certeza que o SOAP não apoiar é uma con
D.Rosado
11
O fato de MVC e WebAPI coexistirem, é um CON.
Phill
4
O ServiceStack v3 ainda é gratuito e o AFAIK sempre será, não acho que nada do mythz mencionado seja específico da v4.
Kyle Gobel
14
Uau, "não está mais livre" é um eufemismo. US $ 999 por desenvolvedor para uma empresa com mais de dez funcionários?
Ryan Lundy
7
Meu maior motivo para mudar da API do Service Stack para a Web é que o Service Stack v3 não é mais suportado no iOS (usando o Xamarin) com o novo requisito de arquitetura de 64 bits. Obviamente, as atualizações estão na v4, que é a versão paga.
SgtRock 17/02
21

Não posso dizer muito sobre o ServiceStack, mas a API da Web tem muitos recursos excelentes e está atualmente na versão 2.

Algumas das ações que você pode fazer com a API da Web:

  • Auto-host em um aplicativo OWIN (ou seja, é executado em qualquer lugar).
  • Suporte completo para asynce await.
  • Bons modelos padrão e muitos exemplos de código aberto.
  • Excelente serializador Json.Net JSON usado.
  • Rest-ish por padrão (você precisará fazer a hipermídia).
  • e mais...
user3377837
fonte
1
Tudo nesta lista também está presente no ServiceStack ou pode ser visto como um golpe. O serializador JSON do ServiceStack, embora seja menos popular, é muito mais rápido que o JSON.NET. É improvável que o suporte ao OWIN seja implementado porque o @mythz tem opiniões fortes contra essa tecnologia, que são razoavelmente sólidas ( veja seus comentários sobre essa solicitação de recurso ).
ygormutti 02/09/2015
3
Olhando para o pacote de nuget OWIN que não foi atualizado desde que foi publicado há três anos, eu realmente não vejo o ponto em todo esse hype em torno do suporte ao OWIN. Parece que as pessoas realmente querem ter OWIN porque a Microsoft disse uma vez que é legal. Caso contrário, você provavelmente nunca ouviria falar sobre o OWIN. A Microsoft desistiu felizmente do seu novo brinquedo K. Isso atenua o argumento "A Microsoft está por trás disso, para que viva para sempre", pois a Microsoft tem uma forte tendência a matar projetos que foram fortemente pressionados por eles.
Alexey Zimarev 08/09/2015
Por que responder se você não tem experiência com o ServiceStack?
Brian Ogden
6

Como cliente do ServiceStack, aqui é o profissional do ServiceStack mais importante para mim.

https://github.com/ServiceStack/Issues/issues/606

Assim. Bug encontrado, bug identificado, bug corrigido. Mesmo dia. Suporte extraordinário!

labilbe
fonte
3

Faz um ano que eu uso SS e está tudo ótimo. ORMLite é pura magia. Consegui remapear um banco de dados MySQL horrível para integrar aplicativos móveis. Nenhuma alteração no banco de dados, pois é usada com um back-end php com outros aplicativos ...

Mythz é um exemplo sobre suporte e explicação. Ele atualizou meu conhecimento sobre o design de aplicativos e a simplicidade na manutenção. Por favor, tente e você entenderá.

Além disso, não compare SS com WebAPI. Não basta, os SS trazem muito mais à sua caixa de ferramentas. O ServiceStack.Text também é um excelente Automapper.

André Leblanc
fonte