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的:
- 免费使用您的项目(只要您有一个允许商业使用的VS许可证)
- Microsoft提供的非常高级别的免费支持以及全部networking,包括StackOverflow.com。
- 快速集成其他微软技术堆栈,如微软商店中极受欢迎的ASP.NET MVC
- 内置支持Microsoft堆栈中的RESTfulauthentication和授权
Con's:
- 不支持SOAP
辅助福利
(请随时留下评论,以增加为什么Web API有好处,或有利可图我可以添加)
我无法对ServiceStack说得太多,但是Web API有很多很棒的function,目前在版本2中。
您可以使用Web API执行的一些操作:
- OWIN应用程序中的自主主机(即在任何地方运行)。
- 完全支持
async
和await
。 - 良好的默认模板和吨的开源示例。
- 使用了很棒的Json.Net JSON序列化器。
- 默认是rest(你必须自己做超媒体)。
- 和更多…
- Java完成非零退出值2 – Android Gradle
- ASP WebAPI通用List可选参数
- Web Api + HttpClient:在asynchronous操作仍在等待时完成的asynchronous模块或处理程序
- 通过隧道(使用ngrok)将localhost暴露给互联网:HTTP错误400:错误的请求; 无效的主机名
- ASP.NET MVC 4应用程序调用远程WebAPI
- HttpContent.ReadAsAsync在哪里?
- 如何为C#MVC4 WebAPI应用程序全局logging所有exception?
- 为什么要创buildasynchronousWebAPI操作而不是同步?
- Web API:使用MultipartMemoryStreamProvider时如何访问多部分表单值?