我希望能够继续通过 http 调用该函数,但我也想触发它每小时运行一次,因此我创建了一个 TimerTrigger 函数“ScheduledSync”,其唯一目的是通过 HTTPRequestMessage 调用“Sync”函数。
ScheduledSync 在本地调用并成功运行 HTTP 触发函数时运行良好,但一旦在 Azure 中发布,对https://xxx.azurewebsites.net/api/sync的 HTTP 请求就会失败。
我尝试过的所有方法都没用,在 ScheduledSync 函数日志中收到了未授权的 403 错误。我之前传递了函数的密钥,但后来完全取消了身份验证,但这就像 Azure 不允许函数使用完整的 Azure URL 调用自身一样,而且 localhost 在 Azure 中也不起作用。我可以从 PostMan 远程调用 ScheduledSync 正在调用的同一个 Azure 同步 URL,无需身份验证或密钥,并且它成功运行。
尝试根据这个问答进行重构,但似乎没有什么不同。
[Function("Sync")]
public async Task<HttpResponseData> Run(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
FunctionContext _,
CancellationToken cancellationToken)
{
... //sync code
[Function("ScheduledSync")]
public async Task RunAsync([TimerTrigger("0 0 * * * *")] TimerInfo timerInfo, CancellationToken cancellationToken)
{
...
try
{
using var request = new HttpRequestMessage(HttpMethod.Post, uri);
var response = await _httpClient.SendAsync(request, cancellationToken);
... // logging and error handling code
功能日志:
2025-04-28T22:46:00Z [Information] Executing 'Functions.ScheduledSync' (Reason='Timer fired at 2025-04-28T22:46:00.0027402+00:00', Id=895d3ab8-b00e-40b0-837d-a77892b125c6)
2025-04-28T22:46:00Z [Information] Trigger Details: ScheduleStatus: {"Last":"2025-04-28T22:45:00+00:00","Next":"2025-04-28T22:46:00+00:00","LastUpdated":"2025-04-28T22:45:00+00:00"}
2025-04-28T22:46:00Z [Information] Start processing HTTP request POST https://xxx.azurewebsites.net/api/Sync
2025-04-28T22:46:00Z [Information] Sending HTTP request POST https://xxx.azurewebsites.net/api/Sync
2025-04-28T22:46:00Z [Information] Received HTTP response headers after 46.0215ms - 403
2025-04-28T22:46:00Z [Information] End processing HTTP request after 46.2548ms - 403
2025-04-28T22:46:00Z [Error] Scheduled Sync call failed with status Forbidden: <!DOCTYPE HTML>
<HTML>
....
<h1 id="unavailable">Error 403 - Forbidden</h1>
<p id="tryAgain">The web app you have attempted to reach has blocked your access
</p>
...
</HTML>
提前感谢您提供的任何帮助。
Azure 有很多“陷阱”来阻止默认设置。其中之一就是所谓的访问限制。这些限制通常默认为“禁止访问”或类似的设置。您需要创建一条规则,允许您的函数访问所需的其他函数。您可以通过多种方式(包括通过 IP)来执行此操作。
更多信息请参见:https://learn.microsoft.com/en-us/azure/app-service/app-service-ip-restrictions? tabs=azurecli