我有一个Azure函数,它每周一次在计时器触发器上运行。这可以很好地工作,并且符合预期,但是每个月大约需要一到两次,用户需要根据需要运行该功能,因此我需要在该功能上做一个发布以触发它-就像您可以在Azure门户中进行的操作。 / p>
在Azure门户上,正在对以下功能进行http发布请求:
https://{funcapp}.azurewebsites.net/admin/functions/{func}
但是,如果我从Postman进行此操作,则会收到Http 401响应。我将如何去做这个请求?
我有一个选择,宁可将触发器更改为队列,又有每周运行第二个函数,该函数会将消息添加到队列中,但这对我来说似乎有点过分。
答案 0 :(得分:4)
如果要调用admin API来触发计时器功能,则需要在请求中添加功能主键,否则将获得401 Unauthorized。
在“功能”应用程序设置面板>“主机键(所有功能)> _master”上找到它。
将其添加到您的请求标头x-functions-key:<masterkey>
中。
请注意,在此后发给admin API的请求中,您需要发送application/json
类型的主体(至少包含一个空的json {}
),此格式为必填项,否则您可能会得到415 Unsupported Media输入
如果此发布请求是由用户执行的,并且您不希望向其公开主密钥,我建议您使用@Marie提供的解决方案,尝试一下,您可能会发现它并没有您想像的那么严重。
答案 1 :(得分:2)
如果您通过一个功能应用程序可以由多个功能组成这一事实来共享功能之间的业务逻辑,该怎么办?然后,您可以使一个function.json触发器基于HTTP请求,而另一个触发器基于计时器。
您的功能应用架构可能如下所示:
MyFunctionApp
| host.json
|____ shared
| |____ businessLogic.js
|____ function1
| |____ index.js
| |____ function.json
|____ function2
|____ index.js
|____ function.json
在“ function1 / index.js”和“ function2 / index.js”中
var logic = require("../shared/businessLogic");
module.exports = logic;
function1和function2的function.json可以配置为不同的触发器(计时器和HTTP或队列...任何您想要的!)。
在“ shared / 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();
};
(这是一个JavaScript示例,但其他语言也一样!)