ServiceStack与ASP.Net Web API

fli*_*art 298 servicestack asp.net-web-api

我想编写一个新的REST样式API并查看ServiceStack并且非常喜欢它.但是,我已经看到Microsoft已经发布了ASP.Net Web API项目,作为新MVC 4 beta的一部分.有没有人看过新的Web API项目?你能给出每个系统的优缺点吗?

myt*_*thz 387

它们具有非常相似的用例,作为ServiceStack项目的主要维护者,我很好地了解了ServiceStack的优势以及基于消息的设计许多自然优势.

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

简约而优雅的设计

在追求极致简约的过程中,它围绕着一个简单而优雅的核心构建- 其大部分功能自然地与您的模型绑定,而不是您的控制器 - 这就是MVA,WebApi所做的(以及Microsoft已生成的所有其他Web服务框架) ).

采用基于消息的设计为远程服务提供了一种卓越的方法,因为它们可以促进更多可扩展和不易碎的服务,简化访问和调用模式,并包含免费获得的许多其他自然优势.

作为核心任务,我们在每个阶段都要对抗复杂性,旨在保持隐形和非侵入性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几乎不可见且不可见-invasive,即提取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服务示例中所示:

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

返回普通的C#对象

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

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

以下类型未转换并直接写入响应流:

  • IStreamWriter
  • byte [] - 使用application/octet-stream内容类型.

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

HTML支持

在ServiceStack中有多个返回HTML的选项,这将在此处详细说明.

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

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

ServiceStack的文本序列化程序非常有弹性,可以承受极端版本而不会出错.

无摩擦开发体验端到端

ServiceStack的固执性质允许端到端的快速,类型化,简洁的Web服务API,内置支持Sync/Async C#/ .NETAsync Silverlight客户端,无需任何代码:

同步C#示例

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

异步C#示例

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

因为它只返回纯JSON,所以它也很容易被其他HTTP客户端使用,例如使用jQuery的JS客户端示例:

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

高度可测试

所有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)
    */
}
Run Code Online (Sandbox Code Playgroud)

为了在JavaScript中消除错误变得微不足道,您可以使用轻量级的ss-validation.js JavaScript库通过一行代码将响应错误简单地绑定到HTML表单字段.该SocialBootstrapApi示例项目提供了一个很好的示范.

与ASP.NET和MVC的丰富集成

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

ServiceStack还包括一个更新,更干净的身份验证和自动化提供程序模型,其中包含许多内置的AuthProvider:

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

Authentication模块完全是可选的,并且内置了干净的ICacheClient/ISession API和OrmLite,它允许您的Sessions存储在Memory,Redis或Memcached中,并且您的UserAuth信息保存在OrmLite支持的SQLServer,MySql,PostgreSQL,Sqlite的RDBMS中.以及Redis数据存储或InMemory(对开发/测试很有用).

伟大的文档

ServiceStack有很好的文档记录,其中大部分有关框架的信息都托管在GitHub wiki上.可以在servicestack.net/docs/上找到该框架其他部分的文档(例如Serializers,Redis,OrmLite).

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

除了上述内容之外,谷歌集团包含了一大堆信息,近年来这一信息已经大大扩展.

到处运行

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

Windows 3.5和4.0

带有Mono的Linux/OSX

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

使用开源开发模型开发

ServiceStack是开源开发模型的坚定信徒,它在开放时积极开发,自开始以来一直以自由OSS许可(New BSD)为主.截至今天,它已收到超过47位开发者的贡献,目前它是GitHub上第三个最受关注的C#项目.

缺点

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

反馈和社区资源

ServiceStack得到了很好的响应,大多数人都提供了积极的反馈,他们通过邮件组的积极情绪对其进行了评估.截至今年,@ ServiceStack Twitter帐户一直在跟踪其收藏夹中的提及和反馈.

社区资源的wiki页面,了解更多关于ServiceStack在链接到博客,波德广播,简报,要旨,更野性的好地方.

  • 这似乎与Web API的比较似乎不大.这很有道理 - 在答案的时候,Web API是全新的.事实并非如此.我真的很想看到实际故障,我担心这个答案已经过时了. (82认同)
  • 值得指出的是,从v4.0开始,ServiceStack正在转向仅限商业/二进制的发行版.有关详细信息,请参阅Demis的[Google+信息](https://plus.google.com/app/basic/stream/z12tfvoackvnx1xzd04cfrirpvybu1nje54). (35认同)
  • 作为尝试使用WCF,webapi和现在的ServiceStack的人,坚持使用ServiceStack.1)WCF对于大多数人来说是不必要的太复杂.这是旧的"让我们解决所有问题"delima.2)web-api太新了.等待最终版本.它甚至不支持多部分形式的帖子.代码处于不稳定状态.我不会在上面运行商业应用程序.顺便说一下,这个问题不应该被关闭. (30认同)
  • 请使您的网站更加用户友好.这似乎是一个很棒的工具.但是你的网站令人困惑.目前尚不清楚该项目是什么以及它的目标是什么.相比之下,这个答案太棒了. (26认同)
  • 你能否为刚刚发布的ASP.NET WebAPI编辑它. (13认同)
  • 看起来Service Stack最近将其许可证更改为商业友好型AGPL并开始销售商业许可证.也许应编辑这篇文章以反映这一点?现在它看起来就像商业产品的广告.https://github.com/ServiceStack/ServiceStack/blob/master/license.txt (11认同)
  • 很想看到详细的比较,而不仅仅是ServiceStack的专业列表.Web API是否与服务堆栈有一些好的东西,是否有更好的部分,ServiceStack计划接管?相同的碎片?与第一个版本相比,Web API的新版本如何? (10认同)
  • 我非常喜欢ServiceStack背后的想法,但鉴于该项目拥有超过220个贡献,将其商业化是不道德的.贡献者为他们的努力获得了什么?他们会获得版税吗?至少微软支付他们的开发人员的费用,并且在没有给他们支票的情况下完成他们的代码. (10认同)
  • 我很好奇是否有任何基准比较ServiceStack与MVC/WebAPI.我认为它会快一点. (4认同)
  • http://www.servicestack.net/ SS更新了他们的幻灯片,包括WebAPI比较. (3认同)
  • 我意识到这是一年多前写的.在看到两个平台如何发展之后,我将在这一点上给出我的看法.此时,Web API并不是那么新颖.文档已经开始最终赶上产品.所以抓住一本你能理解的书,或者找一个网站来深入了解更多细节.除此之外,您在MVC中学到的很多东西以及您目前所做的工作都很顺利.因此,虽然ServiceStack非常好,但实际上更多的是转换投资,加上更多的培训工作,考虑到你真的只有网站上的文档. (3认同)
  • 我花了几天时间尝试使用WCF创建REST JSON服务.我悲惨地失败了.使用ServiceStack,我在一小时内完成并运行.只是说...... (3认同)
  • 同意 - ServiceStack网站令人困惑和脱节.它让项目失败了.但答案是赞成的 - 它非常好. (2认同)
  • 我喜欢一些ServiceStack,但是一个巨大的缺点是OWIN仍然没有得到官方的支持. (2认同)
  • @PanagiotisKanavos v4已经看到所有项目升级到.NET 4.0,现在支持[服务器端异步](https://plus.google.com/106787359118990653189/posts/KoUyRbmYoPJ)和[客户端异步/等待](https ://plus.google.com/106787359118990653189/posts/NxHUpV1sg1d).您也不需要对长时间运行的任务提供特殊支持,只是不要在异步服务或您自己的自定义注册IHttpHandler中关闭(并继续写入)响应. (2认同)

PW *_*Kad 137

需要考虑一个新的主要区别 - 自v4起,ServiceStack不再可以自由使用. 由于SS专家有一个非常确定的答案,我想为Web API抛出一些

Web API

专业人士:

  1. 免费在您的项目中使用(前提是您拥有允许商业用途的VS许可证)
  2. Microsoft和整个网络提供的非常高级别的免费支持,包括StackOverflow.com.
  3. 快速集成其他Microsoft技术堆栈,如ASP.NET MVC,这在Microsoft商店中非常流行
  4. 内置支持Microsoft堆栈中的RESTful身份验证和授权

Con's:

  1. 不支持SOAP

辅助福利

(请随时在下面留下评论,添加为什么Web API有好处或有我可以添加的优点/缺点)

  • 不确定不支持SOAP是一个骗局 (84认同)
  • 哇,"不再自由"是轻描淡写.每位开发人员*999美元*对于员工超过10人的公司? (14认同)
  • MVC和WebAPI共存的事实是CON. (11认同)
  • 我从服务堆栈切换到Web API的最大原因是iOS(使用Xamarin)不再支持Service Stack v3和新的64位架构要求.当然,更新是在v4中,这是付费版本. (7认同)
  • ServiceStack v3仍然可以免费使用,而AFAIK总是可以使用,我认为mythz提到的任何内容都不是v4特有的. (4认同)
  • @kyle备份任何v3相关文档,然后你可以. (2认同)
  • 你不需要VS来构建任何.NET代码.VS Express(免费)版本已获得商业用途许可.http://stackoverflow.com/questions/13007317/can-i-use-visual-studio-2012-express-edition-for-commercial-use (2认同)

小智 21

我对ServiceStack说的不多,但Web API有很多很棒的功能,目前版本为2.

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

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

  • 看看自三年前发布以来尚未升级的OWIN nuget软件包,我并没有真正看到OWIN支持的所有这些炒作的重点.看起来人们真的想拥有OWIN,因为微软曾经说它很酷.否则你可能根本就听不到OWIN.微软高兴地放弃了它,转而支持他们的新玩具K.这缓解了"微软支持这一点,因此它将永远存在"的论点,因为微软有强烈倾向于杀死被他们大力推动的项目. (3认同)

lab*_*lbe 6

作为ServiceStack的客户,ServiceStack的专业人员对我来说最重要.

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

所以.发现错误,发现错误,错误修复.同一天.非凡的支持!


归档时间:

查看次数:

84698 次

最近记录:

6 年,9 月 前