公开网络客户端可以调用的 API

Expose an API that network clients can call

上下文:我有几个嵌入式设备通过 RS232 连接到计算机。在这台计算机上,我将创建一个程序来控制这些设备,向各个设备发送命令以更改其配置或检索给定时间跨度的记录数据等。

我希望网络上的其他计算机也可以使用此程序中的所有功能。对于 "proof of concept",我制作了一个简单的 WCF 服务,其中包含

等功能
void SetTime(string comPort, DateTime time)
DateTime GetTime(string comPort)
List<string> GetSensors(string comPort)
List<LoggedValue> GetLoggedData(string comPort, string sensorName, DateTime start, DateTime stop)
void RestartDevice(string comPort)

我喜欢 WCF 的地方在于,您可以为 Visual Studio 中的服务自动创建代理 类,并且可以直接使用服务中定义的自定义 类,比如LoggedValue.

但是,我看到很多关于 WCF 过于复杂且开销高的说法,而且 asp.net web API(或 mvc web API 2 或其他名称) 是创建一个易于调用(简单的 HTTP 请求)且开销低的 API 的方法。虽然我同意这两点,但我觉得 WCF 中的强类型 类 会失去很多优势。

此外,我发现“CRUD”操作并不总是能很好地转化为我想做的所有事情;我永远不会做任何 CreateDelete 操作,唯一的 Update 将更改配置值,例如设置日志记录间隔。在 API 中调用不会 return 值的函数,例如 void RestartDevice(string comPort) 对于 web api 似乎也不自然(你会怎么做?)

由于我对这两种技术都没有太多经验,使用哪个方向似乎最自然?这不是一个会被很多客户端访问的服务,请求率会很低。

如果您正在进行概念验证,不妨尝试使用 NetMQ。它是 ZermMQ 的 .NET 端口,为了方便起见,有一个可用的 nuget 包。

当然,WCF 是一个很好的灵活解决方案。根据您的沟通策略,您可能会发现 pub/sub 或广播模型允许您做一些您无法通过网络做的事情 API.

我同意 WebAPI 稍微更易于实现。我使用 WCF 将近 10 年,使用 WebAPI 大约 3 年,现在我发现自己很少使用 WCF。使用 HttpClient.

使用 WebAPI 也非常简单

我认为您不必过分担心最终选择哪种技术堆栈。这两种技术都支持您对 RPC 或命令式操作的要求,两者都得到很好的支持,易于使用,并且具有大致相同的管理开销。

我同意你的分析,你的设备操作合同不容易表达为围绕动词(GET、PUT 等)的一组 RESTful operations, so if you choose WebAPI just ignore all the conventions,并且只使用 POST 表示所有你的命令。