Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代理服务器拓扑的服务器推送与客户端拉送_C#_.net_Architecture_Networking - Fatal编程技术网

C# 代理服务器拓扑的服务器推送与客户端拉送

C# 代理服务器拓扑的服务器推送与客户端拉送,c#,.net,architecture,networking,C#,.net,Architecture,Networking,我需要创建一个由2个组件组成的系统: 处理和存储数据的单一服务器。它还定期向代理发送更新 安装在远程端点上的多个代理。它们在长时间运行的操作中(通常,但不总是)收集数据,这些数据需要到达服务器 我使用的是C#.NET,理想情况下,我希望使用符合标准的通信方法(即理论上也可以使用Java的方法,因为我们将来也可能使用Java代理)。有没有web服务的替代方案?我有什么选择 在我看来,我有3个使用web服务的选项,并进行了以下观察: 客户拉动 代理不需要开放端口,因为它的行为类似于客户端 需

我需要创建一个由2个组件组成的系统:

  • 处理和存储数据的单一服务器。它还定期向代理发送更新

  • 安装在远程端点上的多个代理。它们在长时间运行的操作中(通常,但不总是)收集数据,这些数据需要到达服务器

我使用的是C#.NET,理想情况下,我希望使用符合标准的通信方法(即理论上也可以使用Java的方法,因为我们将来也可能使用Java代理)。有没有web服务的替代方案?我有什么选择

在我看来,我有3个使用web服务的选项,并进行了以下观察:

  • 客户拉动
    • 代理不需要开放端口,因为它的行为类似于客户端
    • 需要轮询服务器以获取更新
  • 服务器推送
    • 在代理上打开端口,因为它的行为类似于服务器
    • 服务器必须轮询代理以获取结果
  • 混血儿
    • 在代理上打开端口,因为它的行为类似于客户端和服务器
    • 没有投票;服务器在需要时推出更新,客户端在结果可用时发送结果
“混合”(代理既是客户机又是服务器)似乎是一个明显的选择,但此应用程序通常会安装在企业和政府环境中,我担心他们在代理上打开端口时可能会遇到问题。我是否过多地关注此问题


我还遗漏了其他的优点和缺点吗?

如果您使用某种消息传递服务器(Java的JMS,C的不确定)然后,您的消息服务器是唯一需要打开端口的服务器,您可以从代理到消息服务器以及从服务器到消息服务器进行双向通信。这将允许您实现混合模式,而无需在代理服务器上打开端口。

我们的朋友在基于拉拽的机器上发誓NISM:


他们喜欢客户端拉式而不是服务器推式的一个主要原因是客户端可能停机,客户端必须(通常)应用服务器推式的所有操作。如果这个标准在您的案例中不重要,也许他们的结论不会是您的结论,但我认为值得阅读“推式与拉式”一文您可以自己决定。我觉得您最好的选择是拉动式选择。它可以满足您的主要系统要求,如下所示:

第一部分:数据需要到达服务器,这显然可以通过调用将数据作为参数发送的web方法来完成

第二部分:(服务器定期向代理发送更新):您仍然可以通过客户端(常规)通过某种web服务方法“请求”自上次拉取以来的更新(某种s时间戳以获取错过的更新)来完成该操作


混合方法对我来说似乎有点奇怪,因为我认为代理是系统的一部分,可能会经常“脱机”,如果出现故障,服务器会怎么做?这通常是一个很难回答的问题/决定,特别是如果你不确定这是否是有意“脱机”的话或者一个系统/网络故障…等

我会说,在这个时代,你可以认真考虑只有拉技术。推的问题是客户端经常隐藏在网络地址遍历设备(NAT)后面。就像无线路由器、宽带调制解调器或公司防火墙一样,它们通常无法从服务器访问


建立出站连接(“家庭电话”),特别是在HTTP/HTTPS等众所周知的端口上,即使在最狭窄的网络下,基本上也可以认为是“可能的”。

我也考虑过.NET中的双向通信-但与RMI一样,这不是标准的合规性:)哦,是的,关于端口:我认为大多数网络管理员都会意识到,在任一端点发起的网络通信都会带来相同的风险,如果这会导致更干净的体系结构,那么允许在代理上打开端口。只要威胁要通过80号端口进行隧道传输,我想他们就会明白拥有自己的端口是一种好处。:)嘿,尽管我也很想,但如果我这么说,我认为NIST不会太高兴:)而且,你只有一个节点需要不断地“更新”,系统才能继续工作。一旦修复了一个死拉客户机,让它回到循环中要比处理一个死推客户机容易得多。我看不到这个应用程序在互联网上被使用,只在公司环境中使用(当然,这里涉及防火墙)。我不认为代理与服务器建立传出连接是一个问题,但是公司可能不愿意允许代理的传入连接-你怎么看?公司的网络管理员通常对打开新的入站端口非常挑剔。如果你能遵守“客户端总是使用HTTP”(即,该应用程序可以在web浏览器中运行)的限制,那么部署过程就会简单得多。当然,不是每个应用程序都能承受这样的限制,我不知道你的具体情况。