ServiceStack与ASP.Net Web API [关闭]


299

我想编写一个新的REST风格的API,并仔细研究了ServiceStack。但是,我已经看到Microsoft作为新的MVC 4 beta的一部分发布了ASP.Net Web API项目。有没有人看过新的Web API项目?您能给出每个系统的优点/缺点吗?

Answers:


389

它们具有非常相似的用例,作为ServiceStack项目的首席维护者,我对ServiceStack的优势以及基于消息的设计许多自然优势有着深刻的了解。

ServiceStack从2008年开始就作为OSS运行的项目而成立,其目标是促进正确设计和实施无摩擦远程服务。

简约典雅的设计

为了追求极致的简单性,它以简单而优雅的核心为基础 -大部分功能自然绑定到您的模型,而不是您的控制器-WebApi正是MVC所做的(以及Microsoft生产的所有其他Web Service Framework) )。

采用基于消息的设计为远程服务提供了一种更好的方法,因为它们促进了更可扩展,更不易碎的服务,简化了访问和呼叫方式,并包含了许多其他免费的自然收益

作为一项核心任务,我们在每个阶段都与复杂性作斗争,以保持不可见和非侵入性的API,并避免引入当今.NET或Web服务开发人员尚不熟悉的任何新概念或人工构造。

例如,您的IService<T>服务实现只是具有自动关联的标准C#类。轻薄包装器用于围绕核心运行时IHttpRequestIHttpResponse类型提供一致且统一的API 。它们还允许访问基础ASP.NET或HttpListener的Request和Response类,因此在使用ServiceStack时永远不会受到限制。

与WCF和WebApi相比

这是ServiceStack和WCF推广的对比API样式的简要概述。WebApi与WCF不同,它鼓励REST-ful API设计。至于2之间的示例,这是我仅有的使用ServiceStack和WebApi编写的相同服务的示例

最佳实践远程服务

ServiceStack主要关注于简单性,性能以及促进Web /远程服务的最佳实践,该实践的重点是尽可能地将Martin Fowlers远程服务设计模式包含在C#中:

  • 外观模式 -当你永远跨进程边界的沟通提示的batchful,粗粒度的接口使用。

  • DTO模式MSDN) -口述使用专用波苏斯来生成您的Web服务响应的有线格式。

  • 网关模式MSDN)封装客户端网关/ DTO模式和服务接口层之间的客户端和服务器之间的通信。

这些模式确保了关注点的清晰分离和无摩擦的迭代开发经验。

增强您的服务

ServiceStack Web服务的核心围绕一个无依赖关系和自动连线的纯C#IService<T>接口,该接口使您可以完全自由地使用干净的POCO与自己的请求和响应DTO定义Web服务合同-使ServiceStack的API几乎不可见且不可见侵入式,即提取C#服务逻辑并在ServiceStack主机外部运行它很简单。

这个要点很好地说明了在ServiceStack中仅使用1个C#.cs类所得到的结果

  • 所有已注册格式的元数据页面
    • 带有WSDL,XSD和C#客户端示例的链接
  • 人性化的HTML报告视图
    • 单个独立的html页面快照(即无外部引用)。包括嵌入式JSON Web服务响应-允许以编程方式访问数据快照。
  • 内置的Mini Profiler(出色的MVC Mini Profiler的端口)
    • 包括Sql分析
  • JSON / JSONP,XML,JSV,CSV和SOAP端点

RestServiceBase和ServiceBase类旨在承载您的自定义C#逻辑,以实现最大程度的潜在重用。例如,其DTO优先设计可以轻松地进行延迟和代理执行,而您的相同C#服务也可以在MQ主机中托管和执行。当您注册IMessageService类似RedisMQ的主机并通过/asynconeway端点调用服务时(即client.SendOneWay()在C#客户端中),会发生这种情况

您还可以使用该base.ResolveService<T>()方法轻松委托和创建组合服务,该方法返回所选服务的自动关联实例,如Nortwind CustomerDetails Service示例所示:

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

返回普通的C#对象

大多数情况下,ServiceStack会按预期序列化大多数C#对象-这是可能的返回类型列表(来自此答案):

  • 任何DTO对象->序列化为Response ContentType
  • 自定义HTTP响应的HttpResult,HttpError,CompressedResult(IHttpResult)

以下类型不会转换,而是直接写入响应流:

  • IStreamWriter
  • byte []-具有应用程序/八位字节流的内容类型。

通过此CORS示例可以看到自定义HTTP标头支持的示例,您可以在其中全局配置或基于每个服务配置HTTP标头。

HTML支持

在ServiceStack中有多个用于返回HTML的选项,这里将详细说明

包括用于.NET的最快的文本和二进制序列化程序

弹性和快速串行是最重要的API中,以确保快速的响应时间,并且不会破坏现有的客户端这就是为什么ServiceStack包括一个版本化API 用于.NET最快的文本串行用的NuGet选项来启用@marcgravell协议缓冲区(.NET最快的二进制串行器)。

ServiceStack的文本序列化程序非常灵活,可以承受极端版本控制而不会出错。

无摩擦的开发经验端到端

ServiceStack自以为是的特性允许快速,类型化,简洁的Web服务API端到端,并内置对Sync / Async C#/。NETAsync Silverlight客户端的内置支持,而无需任何代码源:

同步C#示例

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

异步C#示例

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

由于它只返回纯JSON,因此它也被其他HTTP客户端(例如,使用jQuery的JS客户端示例)简单地消耗掉了:

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

高度可测试

所有C#/。NET ServiceClient共享相同的接口,这使它们具有高度的可测试性和可交换性,以至于您可以具有相同的单元测试,并且还可以用作XML,JSON,JSV,SOAP集成测试

内置丰富的验证和错误处理

为了提供无障碍和整洁的开发经验,ServiceStack还包括内置的类型验证和错误处理,其中抛出C#异常或使用其内置的Fluent验证为客户端提供结构化的,类型化的错误,可在Web服务客户端上轻松访问,例如:

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)
    */
}

要轻松利用JavaScript中的错误,您可以使用轻量级的ss-validation.js JavaScript库通过单行代码将响应错误轻松地绑定到HTML表单字段。该SocialBootstrapApi示例项目提供了一个很好的示范。

与ASP.NET和MVC的丰富集成

ServiceStack MVC的PowerPack重新写入,并修复了大量的ASP.NET和MVC苦恼的与替代其沉重的会议和缓存XML,ASP.NET拖累商有自己的清洁,无依赖,实现ICacheClient和的ISession的API。

ServiceStack还包括一个更新,更清洁的身份验证和授权提供程序模型,其中内置了许多不同的AuthProviders:

  • 凭证-通过发布到/ auth / credentials服务以使用用户名/密码凭证进行身份验证
  • 基本身份验证-允许用户使用基本身份验证进行身份验证
  • Twitter OAuth-允许用户向Twitter注册和验证
  • Facebook OAuth-允许用户向Facebook注册并进行身份验证

身份验证模块是完全可选的,基于干净的ICacheClient / ISession API和OrmLite构建,该模块允许将会话存储在内存,Redis或Memcached中,并且您的UserAuth信息持久存储在OrmLite支持的RDBMS的SQLServer,SQL Server,MySql,PostgreSQL,Sqlite中,以及Redis数据存储区或InMemory(用于开发/测试)。

优质文件

关于ServiceStack的文档非常齐全,其中有关该框架的大多数信息都托管在GitHub Wiki上。可以在servicestack.net/docs/上找到框架其他部分的文档(例如,序列化器,Redis,OrmLite)。

ServiceStack.Examples项目提供了所有ServiceStack的现场演示和入门模板的源代码,而SocialBoostsrapApi项目提供开发Backbone.js的单页应用与ServiceStack和MVC基于Twitter的引导模板的一个很好的起点。

除上述内容外,Google小组中还包含大量的信息,近年来该小组的信息已大大扩展。

无处不在

ServiceStack是一个可在ASP.NET和HttpListener主机上运行的.NET 3.5框架,并且可以托管在.NET或Mono上(琐事:www.servicestack.net由CentOS / Mono提供支持)。这允许您将ServiceStack Web服务托管在以下任一主机上:

装有.NET 3.5和4.0的Windows

具有Mono的Linux / OSX

  • 阿帕奇+ mod_mono
  • Nginx + MonoFastCGI
  • XSP
  • 控制台应用

用开源开发模型开发

ServiceStack坚信开放源代码开发模型,该模型在公开场合一直在积极开发,并且自成立以来就一直以自由OSS许可证(New BSD)托管。截止到今天,它已经收到来自47个开发人员的捐款,目前它是GitHub上第三大受关注的C#项目

缺点

我认为最大的缺点是对于大多数其他未由Microsoft开发(或什至列为可用选项)的OSS .NET项目都是相同的。这意味着在评估框架时,它很少是首选。大多数采用者只会将ServiceStack视为万不得已的方法,因为他们要么对WCF的摩擦和脆弱性,要么对首选Microsoft Stack的性能感到沮丧。

反馈和社区资源

大多数人都认为ServiceStack受到好评,并得到了邮件组中积极情绪的认可,大多数人对此给予了积极评价。截至今年,@ ServiceStack Twitter帐户一直在其收藏夹中跟踪提及和反馈

社区资源 wiki页面是一个好地方,以了解更多有关ServiceStack在链接到博客,波德广播,简报,要旨,更野性。


30
作为尝试使用WCF,webapi和现在的ServiceStack的人,请坚持使用ServiceStack。1)对于大多数人来说,WCF不必要太复杂。这是旧的“让我们解决所有问题”的概念。2)web-api太新了。等待最终版本。它甚至不支持多部分形式的帖子。代码处于不断变化的状态。我不会在上面运行商业应用程序。顺便说一句,这个问题不应该被关闭。
Michael Silver

13
您能否为刚刚发布的ASP.NET WebAPI进行编辑。
布莱克·涅米斯基

26
请使您的网站更加人性化。这似乎是一个很好的工具。但是您的网站令人困惑。目前尚不清楚该项目是什么以及它要解决的目标。相反,这个答案是很棒的。
库格尔2012年

82
这似乎与Web API相比似乎没有多大区别。这很有道理-在回答时,Web API是全新的。情况不再如此。我非常希望看到实际的故障,而且我担心这个答案已经过时了。
乔治·莫尔

35
值得指出的是,从v4.0开始,ServiceStack正在迁移到仅商业/二进制发行版。有关详细信息,请参见Demis的Google+帖子
尼克·琼斯

137

有一个新的主要区别需要考虑-ServiceStack从v4开始不再免费使用。 既然SS专业人士的回答很明确,我想为Web API扔掉一对

网络API

专业人士:

  1. 在项目中免费使用(前提是您拥有允许商业使用的VS许可证)
  2. Microsoft和整个Web站点(包括此处的StackOverflow.com)都提供了非常高水平的免费支持。
  3. 快速与其他Microsoft技术堆栈集成,例如ASP.NET MVC,在Microsoft商店中非常流行
  4. 内置对Microsoft堆栈中的RESTful身份验证和授权的支持

骗局:

  1. 不支援SOAP

辅助福利

(请随意在下面留下评论,以补充为什么我可以添加Web API的优点或优点/缺点)


84
不确定不支持SOAP是否
不利

11
MVC和WebAPI并存是CON。
2013年

4
ServiceStack v3仍然可以免费使用,并且AFAIK始终是免费的,我认为神话中没有提到v4特定的东西。
凯尔·戈贝尔

14
哇,“不再自由”是轻描淡写。拥有十名以上员工的公司,每位开发人员 999 美元
Ryan Lundy 2014年

7
从Service Stack切换到Web API的最大原因是,在具有新的64位体系结构要求的iOS(使用Xamarin)上不再支持Service Stack v3。当然,更新在付费版本的v4中。
SgtRock 2015年

21

关于ServiceStack,我不能说太多,但是Web API具有很多出色的功能,并且当前版本为2。

您可以使用Web API进行的一些操作:

  • OWIN应用程序中的自托管(即在任何地方运行)。
  • 全面支持asyncawait
  • 好的默认模板和大量的开源示例。
  • 使用了很棒的Json.Net JSON序列化器。
  • 默认情况下是闲话(您必须自己做超媒体)。
  • 和更多...

1
此列表中的所有内容也都存在于ServiceStack中或可以看作是缺点。ServiceStack的JSON序列,虽然是不太受欢迎的,是很多 很多比JSON.NET更快。OWIN支持不太可能实现,因为@mythz对这项技术有很强的见解,这很合理(请参阅他对此功能要求的评论)。
ygormutti 2015年

3
查看自三年前发布以来尚未升级的OWIN nuget软件包,我真的看不到围绕OWIN支持的所有此类炒作的意义。看起来人们真的很想拥有OWIN,因为微软曾经说过这很酷。否则,您可能根本不会听说过OWIN。微软高兴地放弃了它,转而支持他们的新玩具K。这减轻了“微软在此背后的支持,因此它将永远存在”的论点,因为微软极有可能杀死他们大力推动的项目。
Alexey Zimarev 2015年

如果您没有使用ServiceStack的经验,为什么要回答?
布赖恩·奥格登


3

我使用SS已经一年了,一切都很棒。ORMLite是纯魔术。我能够重新映射一个完整的MySQL数据库以集成到移动应用程序中。数据库上没有任何更改,因为它与另一个应用程序的php后端一起使用...

Mythz是有关支持和解释的示例。它提升了我对应用程序设计和维护简便性的了解。请尝试一下,您将理解。

另外,请勿将SS与WebAPI进行比较。这还不够,SS为您的工具箱带来了更多收益。ServiceStack.Text也是一个很棒的Automapper。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.