首页 文章

ServiceStack与ASP.Net Web API

提问于
浏览
294

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

4 回答

  • 380

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

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

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

  • 3

    需要考虑一个新的主要区别 - ServiceStack is no longer free to use as of v4. 由于SS专家有一个非常确定的答案我想为Web API抛出一些

    Web API

    Pro's :

    • 免费在您的项目中使用(前提是您拥有允许商业用途的VS许可证)

    • 可从Microsoft和整个网络获得非常高级别的免费支持,包括StackOverflow.com上的免费支持 .

    • 快速集成其他Microsoft技术堆栈,如ASP.NET MVC,这在Microsoft商店中非常流行

    • 内置支持Microsoft堆栈中的RESTful身份验证和授权

    Con's :

    • 不支持SOAP

    Ancillary Benefits

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

  • 135

    它们具有非常相似的用例,作为ServiceStack project的主要维护者,我对ServiceStack的优势和many natural benefits of its message-based design有很好的了解 .

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

    简约优雅的设计

    在追求极致简约的过程中,它围绕a simple and elegant core构建 - 其大部分功能自然地与 your models 绑定,而不是您的控制器 - 这就是MVA,WebApi所做的(以及Microsoft已经生成的所有其他Web服务框架) .

    采用基于消息的设计为远程服务提供了一种卓越的方法,因为它们可以促进更具可扩展性和更少脆弱的服务,简化访问和调用模式,以及contain many other natural benefits you get for free .

    作为核心任务,我们在每个阶段都要对抗复杂性,旨在保持隐形和非侵入式API,并避免引入任何当前.NET或Web服务开发人员尚不熟悉的新概念或人工构造 .

    作为示例,您的 IService<T> 服务实现只是具有自动连线依赖性的标准C#类 . 精简且轻量级的包装器用于围绕核心运行时IHttpRequestIHttpResponse类型提供一致且统一的API . 它们还允许访问底层ASP.NET或HttpListener 's Request and Response classes so you'在使用ServiceStack时永远不会受到限制 .

    与WCF和WebApi形成对比

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

    Best Practices远程服务

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

    • Facade Pattern - 建议在跨进程边界进行通信时使用批量粗粒度接口 .

    • DTO patternMSDN) - 指示使用专用POCO生成Web服务响应的有线格式 .

    • Gateway PatternMSDN)用于封装客户端网关/ DTO模型和服务接口层之间的客户端和服务器通信 .

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

    增强您的服务

    ServiceStack Web服务的核心是以无依赖和自动连接的纯C# IService<T> 接口为中心,使您可以完全自由地使用干净的POCO与您自己的请求和响应DTO定义Web服务 Contract - 将ServiceStack 's API practically invisible and non-invasive, i.e. it'渲染为无关紧要提取您的C#服务逻辑并在ServiceStack主机之外运行它 .

    这个要点是just 1 C# .cs class in ServiceStack所得到的一个很好的例子:

    • 所有已注册格式的元数据页面

    • 带有WSDL,XSD和C#客户端示例的链接

    • 人性化的HTML报告视图

    • 单个自包含的html页面快照(即没有外部引用) . 包括嵌入式JSON Web服务响应 - 允许以编程方式访问数据快照 .

    • 内置Mini Profiler(优秀的MVC Mini Profiler端口)

    • 包括Sql分析

    • JSON / JSONP,XML,JSV,CSV和SOAP endpoints

    RestServiceBase和ServiceBase类旨在托管您的自定义C#逻辑,以便尽可能地重复使用,例如:它的DTO优先设计通常允许延迟和代理执行,同样的C#服务也可以在MQ主机中托管和执行,这是当您注册RedisMQ host RedisMQ host并通过 /asynconeway endpoints 调用您的服务时发生的情况(即C#客户端中的 client.SendOneWay()

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

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

    返回普通的C#对象

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

    • 任何DTO对象 - >序列化为Response ContentType

    • 用于自定义HTTP响应的HttpResult,HttpError,CompressedResult(IHttpResult)

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

    • 字符串

    • IStreamWriter

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

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

    HTML支持

    在ServiceStack中有多个返回HTML的选项explained in detail here .

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

    弹性和快速序列化器在API中最重要的是确保快速响应时间和版本化API,它不会破坏现有客户端,这就是为什么ServiceStack包含带有NuGet选项的fastest text serializers for .NET来启用@marcgravellProtocol Buffers(.NET最快的二进制序列化器) ) .

    ServiceStack的文本序列化程序非常有弹性,可以无错误地显示出来 .

    无摩擦开发体验端到端

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

    同步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客户端一起使用,例如: JS client example using jQuery

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

    高度可测试

    所有C#/ .NET ServiceClient共享相同的接口,使它们highly testable并可交换到可以让 same unit test 也作为XML, JSON, JSV, SOAP Integration Test的点 .

    内置丰富验证和错误处理

    为了提供免费且干净的开发体验,ServiceStack还包含typed validation and error handling内置,其中抛出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 example project提供了一个很好的演示 .

    与ASP.NET和MVC的丰富集成

    ServiceStack MVC PowerPack重新编写并修复了ASP.NET和MVC的许多问题,并为其crippling Session和缓存XML加密的ASP.NET提供程序进行了替换,并提供了自己的ICacheClient和ISession API的清晰且无依赖的实现 .

    ServiceStack还包括一个更新更清洁的authentication and autorization provider model,内置了许多不同的AuthProviders:

    • 凭据 - 通过发布到/ auth / credentials服务来使用用户名/密码凭证进行身份验证

    • Basic 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上 . 框架其他部分的文档(例如Serializers,Redis,OrmLite)可以在servicestack.net/docs/找到

    ServiceStack.Examples Project提供了所有ServiceStack现场演示和入门模板的源代码,而SocialBoostsrapApi project提供了一个很好的起点,可以使用基于Twitters Bootstrap模板的ServiceStack和MVC开发Backbone.js单页面应用程序 .

    除了上述信息之外,近年来,信息宝库也大大扩展 .

    无处不在

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

    Windows with .NET 3.5和4.0

    Linux / OSX与Mono

    • Apache mod_mono

    • Nginx MonoFastCGI

    • XSP

    • 控制台应用程序

    使用开源开发模型开发

    ServiceStack是开源开发模型的坚定信徒,它在开放时积极开发,自成立以来一直在liberal OSS licence(新BSD)下托管 . 截至今天,它已收到超过47 developers的捐款,目前它位于3rd most watched C# project on GitHub .

    缺点

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

    反馈和社区资源

    ServiceStack得到了很好的响应,大多数人通过the positive sentiment in the mailing group对其进行了评估,提供了积极的反馈 . 截至今年,@ServiceStack twitter帐户一直在追踪mentions and feedback in its favorites .

    Community Resources维基页面是一个了解更多关于ServiceStack的好地方,其中包含Blog Posts,Pod Casts,Presentations,Gists等链接 .

  • 20

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

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

    • OWIN应用程序中的自托管(即在任何地方运行) .

    • 完全支持 asyncawait .

    • 良好的默认模板和大量的开源示例 .

    • 使用了很棒的Json.Net JSON序列化程序 .

    • 默认为Rest-ish(你必须自己做超媒体) .

    • 等......

相关问题