如何从Azure WebJob与Azure Web应用程序进行通信?

7
我在Azure Web应用程序旁边运行了一个Azure Webjob。 该作业定期运行,需要在Web应用程序中使用作业的结果。 我该如何将结果传送到Web应用程序中?
我尝试使用WCF的netNamedPipeBinding,但由于Azure Webapp没有启动任务,因此无法向IIS网站添加net.pipe绑定,也无法启用net.pipe协议。
我现在使用basicHttpBinding可以工作,但是这个绑定对整个互联网都是公开的,这绝不是我想要的。 我只想在同一台机器上运行的Webjob和Webapp之间进行本地通信。
更正:我以为在Azure上已经起作用,但事实并非如此。 在Azure上运行时,Webjob会出错:使用basicHttpBinding时,“试图访问禁止其访问权限的套接字127.0.0.1:80”。 可能Webapp有我不知道的内部端口号。

我想知道命名管道是否在Web应用程序内部工作。 - Israel Lot
4个回答

6
您有几个选择:
  1. 使用文件系统传递消息
  2. 使用Azure存储队列在两者之间传递消息
  3. 使用Azure Service Bus队列传递消息
  4. 使用任何共享存储(数据库,Azure存储等)来传递消息
所有这些方法的好处是使您的消息传递异步化,从而更加弹性,因此即使其中一个服务(Web应用程序或Web作业)出现问题,也不会影响整体。

我认为我会采用共享存储的方法。这个应用程序迟早需要一个数据库,所以为什么不现在开始呢?我只是觉得在同一主机上的两个应用程序之间进行通信会更容易一些。 - Ronald Wildenberg

2
您可以使用文件系统在WebJob和网站之间进行通信。它在它们之间共享,并在所有实例之间共享。
只需从WebJob编写一个文件,在Web应用程序中使用文件系统观察器,以识别何时创建或更改文件。
需要注意的是,您不能通过Azure Websites(或WebJobs)通过本地主机进行通信,也不能监听非80/443端口。

1
我将采用Zain建议的共享存储方法(数据库)。您能否解释一下或指向一些文档,说明为什么无法通过本地主机与Azure网站进行通信? - Ronald Wildenberg

0
最接近的答案是在应用设置中设置WEBSITE_DISABLE_SCM_SEPARATION=true。这将使WebApp和SCM进程在同一个沙盒中工作。不幸的是,这个选项已被Azure弃用,不再受支持。感谢大家尝试回答。更多信息可以在这里找到。

0
您可以使用 Azure 服务总线队列,然后将您的服务 (Web 应用程序) 指向从队列消费消息。

1
这是可能的,但对于我想要的东西来说似乎有些过度。我不应该通过服务总线传递消息来到达在同一主机上运行的应用程序。 - Ronald Wildenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接