使用支持双工通道或回调的 .NET Core 的 IPC

Posted

技术标签:

【中文标题】使用支持双工通道或回调的 .NET Core 的 IPC【英文标题】:IPC using .NET Core that supports duplex channel or callbacks 【发布时间】:2017-06-08 16:03:11 【问题描述】:

我正在评估 .NET Core 2.0 的 IPC 通信。我发现 .NET Core 不支持服务器端的 WCF。 .NET Core 中可以使用什么来进行进程间通信以及回调(用于发布-订阅)模型?

【问题讨论】:

【参考方案1】:

如果你准备好进入底层,你可以使用named pipes,但你必须自己实现发布/订阅模式。

在更高的层次上,您可以查看 ZeroMQ/NetMQ 之类的库 - 这些是位于套接字之上的非常薄的层,支持各种模式(如发布/订阅)。

更高级别是真正的消息队列 - RabbitMQ。

当然,原生方式是使用 ASP.NET Core 的 Web API。

【讨论】:

感谢您的建议伊戈尔。无论如何,我们可以使用 asp.net core 在 web api 中启用双工或 pubsub 通信吗? Web API 不支持双工或发布订阅。但是 WebSockets 可以(至少肯定是双工的)。 .NET Core 似乎支持 System.Net.WebSockets 命名空间。【参考方案2】:

我也有类似的需求,但现有的解决方案对我来说有太多依赖项,并且不支持正确的双向通信。

所以我写了PipeMethodCalls 包:

var pipeServer = new PipeServerWithCallback<IConcatenator, IAdder>("mypipe", () => new Adder());
await pipeServer.WaitForConnectionAsync();
string concatResult = await pipeServer.InvokeAsync(c => c.Concatenate("a", "b"));
var pipeClient = new PipeClientWithCallback<IAdder, IConcatenator>("mypipe", () => new Concatenator());
await pipeClient.ConnectAsync();
int result = await pipeClient.InvokeAsync(a => a.AddNumbers(4, 7));

它将方法名称和参数序列化为 JSON,在另一端调用它,然后将响应打包发回。

【讨论】:

看起来不错,但无法引用我的.NET 4.5,因为这只是.NET Core @AlexG 该库是 .NET Standard 2.0,因此您至少需要 .NET 4.6.1 才能使用它。它使用的 API 在 .NET Standard 的早期版本中不存在。 这对我来说是几乎的答案,但我需要将服务器作为 Windows 服务运行并遇到 UnauthorizedAccessExceptions。 .Net Standard 显然没有 PipeSecurity 的实现,所以似乎我对此不走运。不过,在我发现这一点之前,它的效果非常好。

以上是关于使用支持双工通道或回调的 .NET Core 的 IPC的主要内容,如果未能解决你的问题,请参考以下文章

如果出现故障,如何自动重新建立双工通道?

通过 WCF 双工通道长期运行的回调合同 - 替代设计模式?

Wcf 回调网络 tcp 双工仅 1 路故障

WCF:是不是可以在双工通道中使用流模式?

WCF 双工回调示例失败

不活动后出现错误的 WCF 双工回调 - 保持活动长时间运行的推送通知