gpt4 book ai didi

c# - .Net 消息发布/订阅模式

转载 作者:太空狗 更新时间:2023-10-30 01:32:49 25 4
gpt4 key购买 nike

所以我有一个在 NancyFx 上运行的 .Net 应用程序(需要与平台无关)。
我有一个要求,我需要在某个事件发生时发送通知(订阅)。通知将实现这个接口(interface):

public interface INotification
{
public void Notify();
}

这将有许多不同的实现,例如电子邮件、Pushbullet、Pushover 等。

我正在努力解决的是如何实际实现这一点,以便 INotification 的所有实现将执行 Notify()当有订阅时。

谁能指出我正确的方向。

我真的不想使用任何类型的外部队列,因为应用程序将在用户机器上运行。

所以应用程序是自托管的,客户端和服务器位于用户机器上,它不与外界对话,都是内部的。

最佳答案

打扰一下,我只是想确保我没听错。您还没有写出确切的问题,所以我假设您在某些基础上被困在某个地方。我也会忽略 NancyFX,我不知道,我假设如果它支持这种情况,你会在文档中找到它。

要让客户知道某些事情发生了变化,您基本上只有 3 个选项:
(a) 服务器上有一个旧事件列表,当事件发生时服务器会更新它,客户端会定期读取它们并调用执行 Ping 的“通知”!
(b) 每个客户端打开到服务器的连接并保持打开状态,服务器记住连接,当新的连接发生时,通过已经打开的连接向所有客户端发送消息,客户端获取消息并调用他们的“通知”平!
(c) 客户端向服务器发送注册消息,它包含回调地址/端口/等,服务器存储。当事件发生时,服务器读取列表并将信息发送到这些地址,客户端处理这些请求并根据请求调用它们的通知

由于您使用“发布-订阅”一词,我假设您的意思是 (C)。

对于这个选项,关于通知,客户端/服务器的角色实际上是反转 .在正常情况下,服务器向客户端公开 API,客户端连接到它,发送请求,服务器处理它并返回一些响应。在这里,双方必须做同样的事情。客户端应用程序还必须向服务器公开一个可调用的 API,以便当“事件”发生时,服务器可以连接到客户端的 API 并向他发送带有通知数据的请求。

现在,您将如何构建 API - 这取决于您。你可以拥有一个Notify(string xmlizedOrJsonizedData)方法,可以有参数Notify(string infotype, datetime, data) ,或许多方法NotifyEmal(...) NotifyBullet(...) ... - 在实现注册和订阅簿记之后,您只需要服务器使用正确的请求数据调用客户端的 api,就像客户端一直这样做一样。

现在,编写所有这些并重新发明轮子需要做一些工作。有很多图书馆已经可以做到这一点。我看了看,在 NancyFx 文档中没有找到任何关于此的内容。可能您可以使用它来创建客户端 api,就像您创建服务器端 api 一样,但是.. 有一个问题。

客户端和服务器端不同。

当客户端与服务器对话时,只有一台服务器可以发送和收听。你可以用幼稚的方式来做,如果你愿意,甚至可以阻止 UI。当服务器发回通知时,可能有 10000 个客户端。您甚至不应该以幼稚的方式开始编写它。循环这么多客户端并等待完成可能会完全卡住您的服务器,如果不卡住,则会导致减速和超时。此外,服务器是公开的。客户不是。客户端通常位于 NAT、防火墙和所有其他有趣的事物后面,这些事物将流量从客户端-> 到-> 服务器传递,但可能会阻止另一个方向的流量。最基本的例子是阻塞端口。 :80服务器上几乎总是通过防火墙,但 :80客户端上可能不可用,当客户端在 :23122 上打开其 api 时它可能不会在他们的防火墙/路由器上配置..除非您使用 upnp/etc 处理它。

这就是为什么最好选择一个可以为您完成所有这些工作的库。抱歉,我现在不记得任何名称,请检查例如 google 的 PublishSubscribe 模式,或客户端通知或推送通知服务器端库。

这就是为什么发明了一种叫做“WebSockets”的东西。这本质上是我在开始时谈到的选项(B)。真的很值得研究。订阅-发布的整个概念也可以作为通过 websocket 调用/响应服务器/客户端 API/接口(interface)来实现,但它可以为您节省大量工作和网络问题。

我发现了一个可以 use Nancy and SignalR 的信息所以这可能是一个很好的开始。

关于c# - .Net 消息发布/订阅模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36056123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com