ServiceStack与ASP.Net Web API

我想编写一个新的REST风格的API,并已经看过ServiceStack,非常喜欢它。 不过,我已经看到,微软已经发布了ASP.Net Web API项目作为新的MVC 4testing版的一部分。 有没有人看过新的Web API项目? 你能给每个系统的利弊吗?

他们有着非常相似的用例,作为ServiceStack项目的主要维护者,我对ServiceStack的优点以及基于消息的devise的许多自然优势有了很好的了解。

自2008年以来,ServiceStack一直是OSS运行的项目,其唯一目标是促进无摩擦远程服务的正确devise和实施。

简单和优雅的devise

在追求最简单的方面,它是围绕着一个简单而优雅的核心而构build的,其大部分function自然地绑定到您的模型 ,而不是您的控制器 – 这正是MVC,WebApi所做的(以及Microsoft生产的其他任何Web服务框架)。

采用基于消息的devise为远程服务提供了一种优越的方法,因为它们促进了更多的可扩展性和更less的脆弱性服务,简化了访问和调用模式,并包含了许多免费获得的其他自然益处 。

作为一个核心使命,我们在每个阶段都努力争取复杂性,旨在保持一个无形的,非侵入性的API,避免引入当今.NET或Web服务开发人员不熟悉的新概念或人为构造。

作为一个例子,您的IService<T>服务实现只是一个标准的C#类,具有自动连接的依赖关系。 在核心运行时IHttpRequest和IHttpResponsetypes周围使用了轻量级和轻量级的包装来提供一致且统一的API。 他们还允许访问底层的ASP.NET或HttpListener的请求和响应类,所以在使用ServiceStack时永远不会受到限制。

与WCF和WebApi相对照

以下是ServiceStack和WCF推广的对比API风格的简要概述。 WebApi不同于WCF,因为它鼓励REST-ful APIdevise。 至于2之间的例子,这是唯一已知的例子,我用ServiceStack和WebApi写的相同的服务。

最佳做法远程服务

ServiceStack的主要重点是简单性,性能和促进以尽可能惯用C#的Martin Fowlers远程服务devise模式为中心的Web /远程服务最佳实践:

  • 门面模式 – 当您跨越stream程边界进行通信时,build议使用批处理,粗粒度的界面。

  • DTO模式 ( MSDN ) – 指定使用特殊用途的POCO来生成Web服务响应的有线格式。

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

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

授权您的服务

其核心ServiceStack Web服务的核心是一个无依赖和自动连接的纯C# IService<T>接口,它使您可以完全自由地使用干净的POCO来定义您自己的请求和响应DTO的Web服务契约 – 呈现ServiceStack的API实际上是不可见的和非侵入性的,即提取C#服务逻辑并在ServiceStack主机之外运行它是微不足道的。

这个要点是你在ServiceStack中只用1个C#.cs类获得的好例子:

  • 所有注册格式的元数据页面
    • 带有指向WSDL,XSD和C#客户端示例的链接
  • 人性化的HTML报告视图
    • 一个自包含的HTML页面快照(即没有外部参考)。 包含embedded式JSON Web服务响应 – 允许编程访问数据快照。
  • 内置Mini Profiler(优秀的MVC Mini Profiler的端口)
    • 包括Sql分析
  • JSON / JSONP,XML,JSV,CSV和SOAP端点

RestServiceBase和ServiceBase类旨在托pipe自定义C#逻辑,以尽可能最大限度地重用,例如,其DTO优先devise允许延迟和代理执行,同一个C#服务也可以在MQ主机中托pipe和执行当你像RedisMQ主机一样注册一个IMessageService ,并通过/asynconeway端点(即C#客户端中的client.SendOneWay()调用你的服务时会发生什么?

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

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

返回纯C#对象

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

  • 任何DTO对象 – >序列化为Response ContentType
  • HttpResult,HttpError,CompressedResult(IHttpResult)用于定制HTTP响应

以下types不会被转换并直接写入响应stream:

  • stream
  • IStreamWriter
  • 字节[] – 与应用程序/八位字节stream内容types。

此CORS示例可以看到自定义HTTP头支持的一个示例 ,您可以在其中全局或基于每个服务来configurationHTTP头。

HTML支持

在ServiceStack中返回HTML有多种select, 在这里详细解释 。

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

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

ServiceStack的文本串行器非常有弹性,可以承受极端的版本控制而不会出错。

无摩擦开发体验端到端

ServiceStack的自以为是的特性允许一个快速的,types化的,简洁的Web服务API端到端的内置支持同步/asynchronousC#/。NET和asynchronousSilverlight客户端没有任何代码生成:

同步C#示例

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

asynchronousC#示例

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

高度可testing

所有的C#/ .NET服务客户端共享相同的接口,这使得它们具有高度的可testing性和可交换性,从而可以将相同的unit testing也用作XML,JSON,JSV和SOAP集成testing 。

丰富的validation和error handling内置

为了提供无碎片和干净的开发体验,ServiceStack还包含内置的types化validation和error handling ,其中抛出C#Exception或使用其内置的Fluentvalidation为客户提供结构化,types化的错误, ,例如:

 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的许多问题,并replace了它的残缺会话,并caching了XML自助式ASP.NET提供程序,并使用自己的干净且无依赖的ICacheClient和ISession API实现。

ServiceStack还包含一个更新,更干净的身份validation和自动化提供程序模型,其中包含许多不同的AuthProviders:

  • 凭据 – 用于通过发布到/ auth /凭证服务来使用用户名/密码凭证进行validation
  • 基本身份validation – 允许用户使用基本身份validation进行身份validation
  • Twitter OAuth – 允许用户注册并使用Twitter进行身份validation
  • Facebook的OAuth – 允许用户注册和validation与Facebook

authentication模块是完全可选的,并且build立在干净的ICacheClient / ISession API和OrmLite上,它允许你的会话存储在内存,Redis或Memcached中,并且你的UserAuth信息保存在Ordite支持的SQLServer,MySql,PostgreSQL,Sqlite的RDBMS中以及Redis数据存储或InMemory(用于开发/testing)。

伟大的文档

ServiceStack在有关框架的大部分信息托pipe在GitHub wiki上的文档中都有很好的logging。 框架其他部分的文档(例如Serializers,Redis,OrmLite)可以在servicestack.net/docs/上find

ServiceStack.Examples项目提供了所有ServiceStack的实时演示和入门模板的源代码,而SocialBoostsrapApi项目为基于Twitters Bootstrap模板的ServiceStack和MVC开发Backbone.js单页应用程序提供了一个很好的起点。

除上述之外, Google集团内部还包含了一些宝贵的信息,近年来这些信息已经有了相当大的扩展。

到处跑

ServiceStack是一个在ASP.NET和HttpListener主机上运行的.NET 3.5框架,可以在.NET或Mono上运行(琐事: http://www.servicestack.net由CentOS / Mono支持)。 这可以让您的ServiceStack Web服务托pipe在以下任一项上:

与.NET 3.5&4.0的Windows

  • IIS 5/6/7(使用IHttpHandler)
  • VS.NET WebDevServer
  • 控制台应用程序或Windows GUI
  • Windows服务

Linux / OSX与Mono

  • Apache + mod_mono
  • Nginx + MonoFastCGI
  • XSP
  • 控制台应用

采用开源开发模式开发

ServiceStack是开放源代码开发模式的坚定信徒,开放源代码开发模式是一个开放源代码开发模式,自从开放以来,它始终在自由的OSS许可证 (New BSD)下进行托pipe。 截至今天,它已经收到来自超过47个开发人员的贡献,目前在GitHub上的第三个最受关注的C#项目 。

缺点

我认为,对于大多数其他OSS .NET项目来说,最大的缺点是它没有被微软开发(甚至没有列入可用选项)。 这意味着在评估一个框架时,它很less成为首选。 大多数采用者只会评估ServiceStack作为最后的手段,他们或者受到WCF的强加的摩擦和脆弱,或者首选Microsoft Stack的性能感到沮丧。

反馈和社区资源

ServiceStack得到了很好的反馈,大多数人对邮件组中的正面情绪进行了评估。 从今年开始, @ServiceStack的 twitter账号一直在collections夹中跟踪提及和反馈 。

社区资源 wiki页面是一个很好的地方,通过链接到博客文章,Pod演示文稿,演示文稿,Gist等等,了解更多有关ServiceStack的信息。

有一个新的主要区别需要考虑 – 从第4版开始, ServiceStack不再是免费使用的。 由于SS Pro有一个非常明确的答案,所以我想为Web API抛出一对夫妇

Web API

Pro的:

  1. 免费使用您的项目(只要您有一个允许商业使用的VS许可证)
  2. Microsoft提供的非常高级别的免费支持以及全部networking,包括StackOverflow.com。
  3. 快速集成其他微软技术堆栈,如微软商店中极受欢迎的ASP.NET MVC
  4. 内置支持Microsoft堆栈中的RESTfulauthentication和授权

Con's:

  1. 不支持SOAP

辅助福利

(请随时留下评论,以增加为什么Web API有好处,或有利可图我可以添加)

我无法对ServiceStack说得太多,但是Web API有很多很棒的function,目前在版本2中。

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

  • OWIN应用程序中的自主主机(即在任何地方运行)。
  • 完全支持asyncawait
  • 良好的默认模板和吨的开源示例。
  • 使用了很棒的Json.Net JSON序列化器。
  • 默认是rest(你必须自己做超媒体)。
  • 和更多…