如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?

Posted

技术标签:

【中文标题】如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?【英文标题】:How to communicate from Azure web app to WCF services hosted locally in IIS? 【发布时间】:2019-01-06 15:15:39 【问题描述】:

我有一个托管在 Azure 中的 ASP.NET MVC 应用程序。 此应用程序与一个桌面应用程序相辅相成,该应用程序还具有用于与 III 方接口进行通信的 WCF 服务。 WCF 在本地托管。

有成千上万的客户在不同的地理位置使用桌面应用程序。 到目前为止,每个桌面应用程序都在 WCF 的帮助下使用 api 与 Web 应用程序通信。 这仅限于桌面应用程序的按需。 每当桌面应用程序觉得需要与 Web 应用程序通信时,它就会使用 WCF 的 Web api 方式。

现在,我想要的是:- 根据需要从 azure 访问不同的桌面应用程序(通常称为站点)。 这是通过网络应用程序/移动应用程序的在线订购系统所必需的。 我不想继续从桌面应用程序轮询以了解该站点是否有任何新订单。 我觉得如果我能从另一边打球会更好。 另外,请记住,网站的 IP 不会固定。防火墙可能有问题。 NAT 可能会以不同方式转换资源标识符。

Azure 中的服务总线可能会有所帮助,但让我感到困惑的是,每个桌面应用程序都有自己的 WCF 服务,并且订单只能到达各自的站点。

我们将不胜感激。

【问题讨论】:

是的,Service Bus 可以做到这一点。 "Connect your existing on-premises systems to cloud solutionsConnect your existing on-premises systems to cloud solutions" 谢谢 MickyD,我会了解更多。 【参考方案1】:

根据您的描述,Service Bus 消息传递是实现这一目标的完美方式。

更多关于Service Bus Messaging的信息,我们可以参考:Service Bus queues, topics, and subscriptions

此外,我们还可以使用RabbitMQZeroMQ,这与Service Bus Messaging 类似,因为它们都是免费的。您可以选择一种最佳方式来实现您的要求。

关于ZeroMQ和RabbitMQ的区别:

ZeroMQ 有更好的性能,但它是在允许消息数据丢失的情况下构建的,适用于高吞吐量/低延迟的应用程序。与ZeroMQ不同的是,RabbitMQ完全实现了AMQP协议,类似于邮箱服务,支持消息持久化、事务处理、拥塞控制、负载均衡等,使得RabbitMQ拥有更广泛的应用场景。

Function                    RabbitMQ                      ZeroMQ
Message persistence         Support                       Not Support
Transaction                 Support                       Not Support
performance                 Low                           High
stability                   High                          Low
Support for AMQP protocol   Support                       Not Support
Application scenario        Data loss is not allowed      High throughput

更多关于RabbitMQ和ZeroMQ的信息,我们可以参考:

RabbitMQ

ZeroMQ

【讨论】:

感谢李刘的意见。我一定会尝试一下。【参考方案2】:

如果您能够修改桌面应用程序,使用SignalR 实现 websockets 连接可能值得一看。桌面应用程序使用您提供的 SignalR 集线器进行注册。 然后,您可以从例如 ASP.NET MVC 应用程序将数据推送到客户端。它工作非常可靠并且可以很好地处理大量连接。它通常用于实时网络通信,但在您的情况下也可能有用。

缺点可能是,桌面应用程序最初需要注册到一个集线器才能接收推送消息。

【讨论】:

感谢 marcus.braun 的投入。 SIGnalR 似乎是一个潜在的解决方案。按照 SignalR 的方式还有一件事要问。我拥有的桌面应用程序没有 websockets。因此,如果我托管 WCF 服务并在其中实现 SignalR 客户端,我将与 SIgnalR 集线器建立持久连接。每当数据准备好推送到桌面应用程序时,它将被发送到连接的客户端,客户端将能够将该数据处理到数据库。值得考虑吗?我尝试浏览它,但无法获得。 将 signalR 连接移动到客户端计算机上的专用 WCF 服务听起来是个好主意。然后,WCF 将只是集线器和桌面应用程序之间通信过程的中间人,提供 Web 套接字连接并在后台进行集线器注册。 WCF 中 SignalR 的实现与任何 C# 项目中的实现应该没有太大区别。查看这个问题,它可能会为实现提供更多信息(只是快速搜索但看起来不错):***.com/questions/24185227/wcf-service-with-signalr 非常感谢。我会试试的。 :)

以上是关于如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?的主要内容,如果未能解决你的问题,请参考以下文章

如何结合调试 Azure 应用服务和 IIS 托管的 WCF?

如何在IIS / Azure中单独部署webconfig更改?

Azure DevOps - 将 Web 应用程序部署到 IIS

从 iis (C# API) 访问 azure 文件共享

Azure:使用完整 IIS 的内部 WebRole 通信 (netTcpBinding)

如何为托管在 Azure 上的 Web 应用程序和托管在窗口的 IIS 服务器上的 Web 应用程序使用相同的自定义域?