ChatGPT解决这个技术问题 Extra ChatGPT

ServiceStack vs ASP.Net Web API [关闭]

想要改进这篇文章?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。关闭。这个问题是基于意见的。它目前不接受答案。想改进这个问题?更新问题,以便可以通过编辑这篇文章用事实和引用来回答它。 2年前关闭。改进这个问题

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


C
Community

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

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

简约优雅的设计

在追求极致简单的过程中,它围绕 a simple and elegant core 构建 - 它的大部分功能自然绑定到您的模型,而不是您的控制器 - 这是 MVC、WebApi 所做的(以及所有其他 Web微软提供的服务框架)。

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

作为一项核心任务,我们在每个阶段都与复杂性作斗争,旨在保持不可见且非侵入性的 API,并避免引入当今 .NET 或 Web 服务开发人员不熟悉的任何新概念或人工构造。

例如,您的 IService<T> 服务实现只是一个具有自动关联依赖项的标准 C# 类。轻量级包装器用于围绕核心运行时 IHttpRequestIHttpResponse 类型提供一致且统一的 API。它们还允许访问底层 ASP.NET 或 HttpListener 的 Request 和 Response 类,因此您在使用 ServiceStack 时永远不会受到限制。

与 WCF 和 WebApi 对比

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

最佳实践远程服务

ServiceStack 主要关注简单性、性能和促进 Web/远程服务最佳实践,这些最佳实践围绕着在尽可能惯用的 C# 中采用 Martin Fowlers 远程服务设计模式:

外观模式 - 建议在跨进程边界进行通信时使用批量、粗粒度的接口。

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

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

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

为您的服务赋能

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

这个要点是您通过 just 1 C# .cs class in ServiceStack 获得的一个很好的例子:

所有已注册格式的元数据页面,带有指向 WSDL、XSD 和 C# 客户端示例的链接

带有指向 WSDL、XSD 和 C# 客户端示例的链接

人性化的 HTML 报告视图 一个独立的 html 页面快照(即没有外部引用)。包括嵌入式 JSON Web 服务响应 - 允许以编程方式访问数据快照。

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

内置 Mini Profiler(优秀的 MVC Mini Profiler 的移植版)包括 Sql Profiling

包括 Sql 分析

JSON/JSONP、XML、JSV、CSV 和 SOAP 端点

RestServiceBase 和 ServiceBase 类旨在托管您的自定义 C# 逻辑,以尽可能地重用,例如,其 DTO 优先设计允许延迟和代理执行,您的相同 C# 服务也可以在 MQ 主机中托管和执行当您注册像 RedisMQ host 这样的 IMessageService 并通过 /asynconeway 端点(即 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 支持

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

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

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

ServiceStack 的文本序列化程序非常灵活,可以withstand extreme versioning 无错误。

端到端的无摩擦开发体验

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 并且可交换到您可以将 相同的单元测试 也用作 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 并使用自己的 ICacheClient 和 ISession API 的干净且无依赖的实现来缓存受 XML 限制的 ASP.NET 提供程序.

ServiceStack 还包括一个更新、更简洁的 authentication and autorization provider model,其中内置了许多不同的 AuthProvider:

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

基本身份验证 - 允许用户使用基本身份验证进行身份验证

Twitter OAuth - 允许用户在 Twitter 上注册和验证

Facebook OAuth - 允许用户注册和验证 Facebook

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

很棒的文档

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

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

除了上述信息之外,contained within the Google Group 是一个信息宝库,近年来它的规模扩大了很多。

到处跑

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

带有 .NET 3.5 和 4.0 的 Windows

IIS 5/6/7(使用 IHttpHandler)

VS.NET WebDevServer

控制台应用程序或 Windows GUI

视窗服务

带有单声道的 Linux/OSX

阿帕奇 + 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 wiki 页面是了解更多有关 ServiceStack 的好地方,其中包含指向博客文章、Pod Casts、演示文稿、Gists 等的链接。


作为尝试使用 WCF、webapi 和现在的 ServiceStack 的人,请坚持使用 ServiceStack。 1) WCF 对大多数人来说过于复杂。这是旧的“让我们解决所有问题”的定义。 2) web-api 太新了。等待最终版本。它甚至不支持多部分形式的帖子。代码处于不断变化的状态。我不会在上面运行商业应用程序。顺便说一句,这个问题不应该被关闭。
您能否为刚刚发布的 ASP.NET WebAPI 编辑此内容。
请让您的网站更加用户友好。这似乎是一个很棒的工具。但是您的网站令人困惑。目前尚不清楚该项目是什么以及它旨在解决什么。相比之下,这个答案太棒了。
这似乎与 Web API 没有太大的比较。这是有道理的——在回答时,Web API 是全新的。现在不是这种情况了。我真的很想看到一个实际的故障,我担心这个答案已经过时了。
值得指出的是,从 v4.0 开始,ServiceStack 正在转向仅商业/二进制发行版。有关详细信息,请参阅 Demis 的Google+ post
P
PW Kad

有一个新的主要区别需要考虑 - 从 v4 开始,ServiceStack 不再免费使用。由于 SS pro 有一个非常明确的答案,我想为 Web API 抛出几个

网络 API

专业人士:

在您的项目中免费使用(前提是您拥有允许商业使用的 VS 许可证) 可从 Microsoft 和整个网络(包括 StackOverflow.com 上的此处)获得非常高水平的免费支持。快速与其他 Microsoft 技术堆栈集成,例如在 Microsoft 商店中非常流行的 ASP.NET MVC 内置支持 Microsoft 堆栈中的 RESTful 身份验证和授权

缺点:

不支持 SOAP

辅助福利

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


不确定不支持 SOAP 是一个骗局
MVC 和 WebAPI 共存的事实是一个 CON。
ServiceStack v3 仍然可以免费使用,AFAIK 永远都是,我不认为提到的任何神话都是 v4 特定的。
哇,“不再免费”是轻描淡写的说法。对于拥有 10 名以上员工的公司,每位开发人员 999 美元?
我从 Service Stack 切换到 Web API 的最大原因是 iOS(使用 Xamarin)不再支持 Service Stack v3,并且具有新的 64 位架构要求。当然,更新是在付费版本 v4 中。
J
J0e3gan

关于 ServiceStack,我不能说太多,但 Web API 有很多很棒的特性,目前是第 2 版。

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

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

完全支持异步和等待。

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

使用了很棒的 Json.Net JSON 序列化器。

默认情况下是 Rest-ish(你必须自己做超媒体)。

和更多...


此列表中的所有内容也存在于 ServiceStack 中,或者可以视为一个骗局。 ServiceStack 的 JSON 序列化程序虽然不太流行,但比 JSON.NET much much 快。 OWIN 支持不太可能实现,因为@mythz 对该技术有强烈的反对意见,这是相当合理的 (see his comments on this feature request)。
查看自三年前发布以来尚未升级的 OWIN nuget 包,我并没有真正看到所有围绕 OWIN 支持的炒作的意义。看起来人们真的很想拥有 OWIN,因为微软曾经说过它很酷。否则,您可能根本不会听说过 OWIN。微软很高兴地放弃了它,转而支持他们的新玩具 K。这减轻了“微软支持这一点,因此它将永远存在”的论点,因为微软有强烈的倾向来扼杀由他们大力推动的项目。
如果您没有使用 ServiceStack 的经验,为什么要回答?
l
labilbe

作为 ServiceStack 的客户,这里是 ServiceStack 的专业人士,对我来说最重要。

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

所以。发现错误,识别错误,修复错误。同一天。难得的支持!


A
André Leblanc

我使用SS已经一年了,一切都很棒。 ORMLite 是纯粹的魔法。我能够重新映射一个糟糕的 MySQL 数据库以集成到移动应用程序中。数据库没有变化,因为它与另一个应用程序的 php 后端一起使用......

Mythz 是一个关于支持和解释的例子。它提升了我关于应用程序设计和维护简单性的知识。请尝试一下,你会明白的。

另外,不要将 SS 与 WebAPI 进行比较。这还不够,SS 给你的工具箱带来了更多。 ServiceStack.Text 也是一个很棒的 Automapper。