手动触发Azure功能-时间触发

mie*_*oor 3 azure azure-functions

我有一个Azure函数,每周一次在计时器触发器上运行。效果很好,符合预期,但是每月大约需要一两次,用户需要根据要求运行该功能,所以我需要在该功能上做一个发布以触发它-就像您可以从Azure门户中进行操作一样。

查看Azure门户,正在对以下功能进行http发布请求:

https://{funcapp}.azurewebsites.net/admin/functions/{func}
Run Code Online (Sandbox Code Playgroud)

但是,如果我从Postman进行此操作,则会收到Http 401响应。我将如何执行此请求?

我有一个选择,宁可将触发器更改为队列,又每周运行第二个函数,这会向队列中添加一条消息,但这对我来说似乎有点过分。

Mar*_*ger 6

如果您通过使用单个功能应用程序可以由多个功能组成的事实在功能之间共享业务逻辑会怎样?然后,您可以拥有一个基于 HTTP 请求的 function.json 触发器和基于计时器的另一个触发器。

您的函数应用架构可能如下所示:

MyFunctionApp
|     host.json
|____ shared
|     |____ businessLogic.js
|____ function1
|     |____ index.js
|     |____ function.json
|____ function2
      |____ index.js
      |____ function.json
Run Code Online (Sandbox Code Playgroud)

在“function1/index.js”和“function2/index.js”中

var logic = require("../shared/businessLogic");

module.exports = logic;
Run Code Online (Sandbox Code Playgroud)

function1 和 function2 的 function.json 可以配置为不同的触发器(定时器和 HTTP 或队列......任何你想要的!)。

在“共享/businessLogic.js

module.exports = function (context, req) {
    // This is where shared code goes. As an example, for an HTTP trigger:
    context.res = {
        body: "<b>Hello World</b>",
        status: 201,
        headers: {
            'content-type': "text/html"
        }
    };     
    context.done();
};
Run Code Online (Sandbox Code Playgroud)

(这是一个 JavaScript 示例,但对于其他语言也是如此!)


Jer*_*Liu 5

如果要调用admin API触发计时器功能,则需要在请求中添加功能主键,否则将获得401 Unauthorized。

在功能应用程序设置面板>主机键(所有功能)> _master上找到它。

将其添加到您的请求标头中x-functions-key:<masterkey>

请注意,在此后发给admin API的请求中,您需要发送一个application/json正文(至少包含一个空的json {}),此格式是必需的,否则您可能会收到415不支持的媒体类型。

如果此发布请求是由用户执行的,并且您不希望将主密钥暴露给用户,那么我建议您使用@Marie提供的解决方案,尝试一下,您可能会发现它并没有您想像的那么大。

  • 现在,此方法已正式记录在这里:https://docs.microsoft.com/mt-mt/Azure/azure-functions/functions-manually-run-non-http (2认同)