- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在研究 WebAPI 并且非常喜欢我所看到的。
有理由不使用 WebAPI 吗?如果是这样,在什么情况下?
我最初认为在跨平台的 SOA 架构中,WebAPI 可能会达不到要求,但是我阅读的文章越多,我就越意识到 WebAPI 在几乎所有现实场景中都可能击败 WCF。看起来您可以将 WebAPI 用于 android、ios 等,而不仅仅是用于 .Net;甚至性能显示 WCF REST 最慢。 http://weblog.west-wind.com/posts/2012/Sep/04/ASPNET-Frameworks-and-Raw-Throughput-Performance
WCF 是否还有更好的“明显”原因?
最佳答案
每当您控制消费者和提供者端点(例如后端服务到服务通信)时,您都应该使用 WCF(或套接字)来获得功能和性能。通过 WCF 托管服务然后共享二进制合约意味着客户端和服务器之间 100% 保证匹配、编译器检查和类型安全(反)序列化。
如果您还拥有完整的 CI,那么您几乎可以消除发布带有不匹配合约的二进制文件的风险。 Web API 序列化更宽容,因此验证和测试涉及更多(客户端可以发送数据服务器不期望,服务器可以发送数据客户端不期望。) WCF 还支持契约(Contract)版本控制和扩展数据,这允许中介服务只知道 V1 合约仍然可以接受并转发到 V2 或更高版本的消息,同时保留理解 V2 或更高版本合约的服务的所有数据!)
WebAPI 主要用于以最小的挫折实现基于 HTTP 的服务,因此,WebAPI 在很大程度上依赖于 asp.net HTTP Web Stack 来运行(而 WCF 及其基础并没有,事实上,一些 WebAPI 功能直接依赖于 WCF。 . 例如,通过 WebAPI 公开 OData 提要。)
与 Web API 端点类似,WCF 端点可以配置为在必要时通过 HTTP 提供访问(以及其他协议(protocol)和技术,例如安全命名管道、MSMQ、UDP、TCP 等)。WCF 也是可扩展的,并且开箱即用为双工、双向和可靠消息传递提供传输实现,它使用 token 、证书、基本身份验证凭据等提供传输级和消息级身份验证。对服务发现、订阅、广播等有额外的支持(诚然,WebAPI 提供了一些重叠,但控制级别不同。)
WCF 不仅支持所有这些,而且高度可配置,允许您通过配置文件和代码在大多数可用传输、格式化/序列化、安全性、实例化、生命周期和其他服务设置之间进行混合和匹配。
现在将您的两个中间层一起移动到同一台机器中?切换到命名管道。将服务器从 .net 交换到 PHP?没问题,将绑定(bind)配置从使用 net.tcp 更改为使用 soap。 WebAPI 停止的地方,WCF 继续。
但是,与任何技术一样,WCF 的亮点在于开发人员对网络和基础架构的理解。放在平庸或不情愿的人手中,你会得到一团糟,无法执行。 WebAPI 更简单一些,即使是初学者程序员也可以在几分钟内使用它,并且通常会成功完成他们的任务。
2c
关于wcf - 不使用 WebAPI 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20327183/
我对cassandra并使用1.2.10非常陌生。我有一个时间戳数据类型的主键列。现在,我正在尝试检索日期范围的数据。由于我们知道不能在cassandra中使用,因此我使用的是大于()来获取日期范围。
我正在尝试进行有条件的转场。但我得到: Terminating app due to uncaught exception 'NSInvalidArgumentException', reas
我有一个游戏项目,在调试和发布模式下在设备上运行得非常好。我有两个版本。旧版本和新版本具有更多(后来我添加了)功能,并且两者的 bundle ID、版本相同。当我构建旧版本时,之前没有安装“myGam
这个问题已经有答案了: 奥 git _a (2 个回答) 已关闭 5 年前。 我正在获取 ClassCastException 。这两个类来自不同的 jar,但是JettyContinuationPr
以下代码行抛出异常: HttpResponse response = client.execute(request); // actual HTTP request 我能够捕获它并打印: Log
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
public class TwoThreads { private static Object resource = new Object(); private static void
当我输入 6 (int) 作为值时,运行此命令会出现段错误 (gcc filename.c -lm)。请帮助我解决这个问题。预期的功能尚未实现,但我需要知道为什么我已经陷入段错误。 谢谢! #incl
所以,过去一周半我一直在研究这个 .OBJ/.MTL 网格解析器。在这段时间里,我一直在追踪/修复很多错误、清理代码、记录代码等等。 问题是,每修复一个错误,仍然会出现这个问题,而且一张图片胜过一千个
我正在运行一个代码,它基本上围绕 3 个维度旋转一个大数据数组(5000 万行)。但是,我遇到了一个奇怪的问题,我已将其缩小到如何评估旋转矩阵。基本上,对于除绕 x 轴以外的任何旋转,python 代
就在你说这是重复之前,我已经看到了其他问题,但我仍然想发布这个。 所以我正在阅读 Thinking in Java -Bruce Eckel 这篇文章是关于小写命名约定的: In Java 1.0 a
我想在我的应用程序中使用 REST API。它为我从这个应用程序发出的所有请求抛出 SocketTimeoutException。 Logcat 输出:(您也可以在此处看到带有漂亮格式的输出:http
我知道 raise ... from None 并已阅读 How can I more easily suppress previous exceptions when I raise my own
在未能找到各种Unix工具(例如xargs和whatnot)的最新独立二进制文件(this version很好,但需要外部DLL)后,我承担了自己进行编译的挑战。 ...这是痛苦的。 最终,尽管如此,
我有一个用PHP编写的流套接字服务器。 为了查看一次可以处理多少个连接,我用C语言编写了一个模拟器来创建1000个不同的客户端以连接到服务器。 stream_socket_accept几次返回fals
我的Android Studio昨天运行良好,但是今天当我启动Android Studio并想在移动设备上运行应用程序时,发生了以下错误, 我在互联网和stackoverflow上进行了搜索,但没有解
默认情况下,grails似乎为Java域对象的toString()返回:。那当然不是我想要的,所以我尝试@Override toString()返回我想要的。当我尝试grails generate-a
尝试通过LDAP通过LDAP对用户进行身份验证时,出现以下错误。 Reason: Cannot pass null or empty values to constructor. 谁能告诉我做错了什么
我正在尝试使用应用程序附带的 Houdini Python 模块,该模块是 Houdini 安装文件夹的一部分,位于标准 Python 路径之外。按照安装说明操作后,运行 Houdini Termin
简单地说,我正在为基本数据库编写单链表的原始实现。当用户请求打印索引下列出的元素高于数据库中当前记录数量时,我不断出现段错误,但仅当差值为 1 时。对于更高的数字,它只会触发我在那里编写的错误系统。
我是一名优秀的程序员,十分优秀!