我想编写一个新的REST风格的API,看过ServiceStack后感觉不错。然而,我发现微软已经发布了ASP.Net Web API项目作为新版MVC 4的一部分。有人研究过这个新的Web API项目吗?您能说出每个系统的优缺点吗?
我想编写一个新的REST风格的API,看过ServiceStack后感觉不错。然而,我发现微软已经发布了ASP.Net Web API项目作为新版MVC 4的一部分。有人研究过这个新的Web API项目吗?您能说出每个系统的优缺点吗?
我是一名有用的助手,可以进行翻译。以下是需要翻译的内容:
它们具有非常相似的用例,作为ServiceStack项目的主要维护者,我对ServiceStack的优势和其基于消息的设计的许多自然优点有很好的了解。
ServiceStack自2008年以来一直是一个开源项目,从一开始就有一个单一的目标,即推广正确的无摩擦远程服务的设计和实现。
为了追求最终的简单性,它建立在一个简单而优雅的核心之上 - 大多数功能自然地绑定到您的模型,而不是您的控制器 - 这就是MVC、WebApi所做的事情(以及微软生产的每个其他Web服务框架)。
采用基于消息的设计为远程服务提供了一种更优越的方法,因为它们促进了更具可扩展性和更少脆弱性的服务,简化了访问和调用模式,并且包含许多其他自然的免费好处。IService<T>
服务实现只是一个带有自动连接依赖项的标准 C# 类。使用薄而轻的包装器来提供围绕核心运行时 IHttpRequest 和 IHttpResponse 类的一致和统一的 API。它们还允许访问底层 ASP.NET 或 HttpListener 的 Request 和 Response 类,因此在使用 ServiceStack 时永远不会受到限制。
以下是ServiceStack和WCF推广的截然不同的API风格的简要概述。WebApi与WCF不同,它鼓励RESTful API设计。至于两者之间的示例,这是我所知道的唯一一个使用ServiceStack和WebApi编写相同服务的示例。
ServiceStack主要关注简单性、性能和促进以尽可能符合C#语言习惯的方式来采用Martin Fowler的远程服务设计模式为中心的网络/远程服务最佳实践:
门面模式 - 建议在跨进程边界通信时使用批处理、粗粒度接口。
这些模式确保了关注点的清晰分离和无摩擦的迭代开发体验。
IService<T>
接口,它让你完全自由地定义你的web服务合同,使用干净的POCOs来定义你自己的请求和响应DTOs。这使得ServiceStack的API几乎是不可见和非侵入性的,也就是说,提取你的C#服务逻辑并在ServiceStack主机之外运行它是微不足道的。IMessageService
像RedisMQ host并通过/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 });
大多数情况下,ServiceStack会将大部分C#对象序列化为预期结果 - 这里是可能的返回类型列表(来自这个答案):
以下类型不会被转换,并直接写入响应流:
可以通过此CORS示例查看自定义HTTP标头支持的示例,您可以在全局或每个服务基础上配置HTTP标头。
在ServiceStack中,有多个返回HTML的选项,这些选项在此处详细解释。
具备弹性和快速序列化程序对于API来说是非常重要的,以确保快速响应时间和可版本化的API,不会破坏现有客户端。这就是为什么ServiceStack包含了.NET中最快的文本序列化程序,并提供NuGet选项来启用@marcgravell的Protocol Buffers(.NET中最快的二进制序列化程序)。
ServiceStack的文本序列化程序非常强大,可以承受极端版本控制而不出错。
var response = client.Send<HelloResponse>(new Hello { Name = "World!" });
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#异常或使用其内置流畅验证提供的结构化、类型化错误易于在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)
*/
}
ServiceStack还包括一个更新和更清晰的身份验证和授权提供程序模型,内置了许多不同的AuthProviders:
身份验证模块完全是可选的,并构建在干净的ICacheClient / ISession API和OrmLite之上,这允许将您的会话存储在Memory、Redis或Memcached中,将UserAuth信息持久化在OrmLite支持的RDBMS(如SQLServer、MySql、PostgreSQL、Sqlite)以及Redis数据存储或InMemory中(对于开发/测试非常有用)。
ServiceStack非常好文档化,大部分关于框架的信息都托管在GitHub wiki上。其他部分框架(例如:序列化器、Redis、OrmLite)的文档可以在servicestack.net/docs/上找到。
ServiceStack.Examples项目提供了所有ServiceStack实时演示和Starter模板的源代码,而SocialBoostsrapApi项目则提供了一个很好的起点,基于Twitter Bootstrap模板,使用ServiceStack和MVC来开发Backbone.js单页应用。
除上述内容外,还有大量信息包含在Google Group中,近年来得到了相当的扩展。
ServiceStack是一个运行在ASP.NET和HttpListener主机上的.NET 3.5框架,可以在.NET或Mono上托管(趣闻:www.servicestack.net由CentOS/Mono提供支持)。这使得您的ServiceStack Web服务可以托管在以下任一平台上:
ServiceStack坚信开源开发模式,积极参与开放式开发并始终以自由的OSS许可证(New BSD)作为其主要托管方式。截至今日,它已经收到了来自47位开发者的贡献,并且目前是GitHub上第三个最受关注的C#项目。
我认为最大的缺点和其他大多数.NET项目一样,它没有被微软开发(甚至没有被列为可用选项)。这意味着在评估框架时,它很少是第一个选择。大多数采用者只会在WCF的摩擦和脆弱性或首选的Microsoft Stack的性能令人沮丧时,将ServiceStack作为最后一个选择来考虑。
ServiceStack 受到了广泛的欢迎,大多数评估过它的人都给予了积极的反馈,这可以从邮件组中积极情绪的表现看出。截至今年,@ServiceStack 推特账户一直在跟踪 提及和反馈。
社区资源 维基页面是一个了解 ServiceStack 的好去处,其中包含博客文章、播客、演示文稿、代码片段等链接。
现在有一个新的主要区别需要考虑 - ServiceStack从版本4开始不再免费使用。 由于SS专业版已经有了相当明确的答案,我想为Web API提供一些方便之处。
优点:
缺点:
附加好处
(请随意在下面留言,以补充Web API的优点或缺点)
关于ServiceStack,我无法多做评论,但是Web API有很多出色的功能,并且目前已经更新到版本2。
使用Web API可以做以下事情:
async
和await
。