ServiceStack与ASP.Net Web API

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


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

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

简单和优雅的设计

在追求极致简洁的同时,它围绕着一个简单而优雅的内核构建 - 其大部分功能自然地绑定到您的模型 ,而不是您的控制器 - 这正是MVC,WebApi所做的(以及Microsoft生产的其他任何Web服务框架)。

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

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

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

与WCF和WebApi相对照

以下是ServiceStack和WCF推广的对比API样式的简要概述。 WebApi与WCF的不同之处在于它鼓励REST-ful API设计。 至于2之间的示例,这是我用ServiceStack和WebApi编写同一服务的唯一已知示例。

最佳做法远程服务

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

  • Facade模式 - 当您跨越流程边界进行通信时,建议使用批处理,粗粒度的界面。

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

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

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

    增强您的服务

    其核心的ServiceStack Web服务主要围绕无依赖和自动连接的纯C# IService<T>接口,它使您可以完全自由地使用干净的POCO定义您的Web服务合同,并使用您自己的请求和响应DTO - 呈现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端点(即C#客户端中的client.SendOneWay()调用您的服务时会发生什么情况。

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

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

    返回纯C#对象

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

  • 任何DTO对象 - >序列化为Response ContentType
  • HttpResult,HttpError,CompressedResult(IHttpResult)用于定制HTTP响应
  • 以下类型不会被转换并直接写入响应流:

  • IStreamWriter
  • 字节[] - 与应用程序/八位字节流内容类型。
  • 此CORS示例可以看到自定义HTTP头支持的示例,您可以在其中全局或基于每个服务配置HTTP头。

    HTML支持

    在ServiceStack中有多个选项可用于返回HTML,这在此处详细介绍。

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

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

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

    无摩擦开发体验端到端

    ServiceStack的自以为是的特性允许通过内置的Sync / Async C#/ .NET和Async Silverlight客户端而不需要任何代码生成端对端的快速,类型化,简洁的Web服务API:

    同步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服务客户端共享相同的接口,这些接口使它们具有高度可测试性和可交换性,从而使您可以将相同的单元测试也用作XML,JSON,JSV和SOAP集成测试。

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

    为了提供无碎片和干净的开发体验,ServiceStack还包含内置的类型化验证和错误处理,其中抛出C#Exception或使用其内置的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 /凭证服务来使用用户名/密码凭证进行验证
  • 基本身份验证 - 允许用户使用基本身份验证进行身份验证
  • Twitter OAuth - 允许用户使用Twitter注册并进行身份验证
  • Facebook OAuth - 允许用户通过Facebook注册并进行身份验证
  • 认证模块完全是可选的,并且建立在干净的ICacheClient / ISession API和OrmLite上,它允许您的会话存储在内存,Redis或Memcached中,并且您的UserAuth信息保存在OrmLite支持的SQLServer,MySql,PostgreSQL,Sqlite的RDBMS中以及Redis数据存储或InMemory(用于开发/测试)。

    很棒的文档

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

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

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

    随处运行

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

    Windows与.NET 3.5和4.0

  • IIS 5/6/7(使用IHttpHandler)
  • VS.NET WebDevServer
  • 控制台应用程序或Windows GUI
  • Windows服务
  • 带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页面是一个很好的地方,可以通过指向博客文章,Pod演绎,演示文稿,Gist等链接了解更多有关ServiceStack的信息。


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

    Web API

    Pro's:

  • 可以在您的项目中免费使用(前提是您拥有允许商业使用的VS许可证)
  • 来自Microsoft和遍布网络的非常高级的免费支持,包括这里的StackOverflow.com。
  • 与微软商店中非常流行的其他Microsoft技术堆栈(如ASP.NET MVC)快速集成
  • 内置支持Microsoft堆栈中的RESTful认证和授权
  • Con's:

  • 不支持SOAP
  • 辅助福利

    (请随意留下评论,以增加为什么Web API有益处或者我可以添加优点/缺点)


    我无法对ServiceStack说得太多,但Web API有很多很棒的功能,目前版本为2。

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

  • OWIN应用程序中的自主主机(即在任何地方运行)。
  • 完全支持asyncawait
  • 良好的默认模板和大量的开源示例。
  • 使用了很棒的Json.Net JSON序列化器。
  • 默认是休息(你必须自己做超媒体)。
  • 和更多...
  • 链接地址: http://www.djcxy.com/p/3459.html

    上一篇: ServiceStack vs ASP.Net Web API

    下一篇: Using Chrome's Element Inspector in Print Preview Mode?