【问题标题】:Run program.cs file of console application in Azure Function?在 Azure Function 中运行控制台应用程序的 program.cs 文件?
【发布时间】:2022-01-07 02:41:34
【问题描述】:

我有一个控制台应用程序,我想将其转换为 Azure Function Timer Trigger 应用程序,该应用程序将在完成一些数据处理和上传后每小时运行一次。数据处理和上传是通过注入到控制台应用程序的 program.cs 文件中的类来完成的。在课堂上的某个地方,我有一个 task.delay by 1hour,它将在第一次查询和上传数据后查询新数据。因此,我将控制台应用程序的整个代码及其包复制到了 Azure Function Timer 触发器应用程序。我要做的是首先在 azure 函数应用程序中运行控制台应用程序的 program.cs 文件,以完成其工作(数据处理、查询数据、将数据上传到 azure ......)。然后启动定时器触发。那可行吗?我可以在azure函数应用的run方法中添加哪行代码先执行program.cs文件,然后再启动触发器。您可以在此处找到 azure function time trigger app 的启动代码。

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;

namespace ExportServiceFunctionApp
{
    public static class ExportServiceFunctionApp
    {
        [FunctionName("ExportServiceFunctionApp")]

        public static void Run([TimerTrigger("0 0 */1 * * * ")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        }
    }
}

【问题讨论】:

  • 嗨@Aboudi,欢迎来到 Stackoverflow!您能否编辑您的问题并在那里添加代码而不是提供图片?这将使我们更容易快速编辑并提供答案。
  • @JustShadow 我编辑了我的问题。谢谢你。只是关于你的问题。我为什么要使用 httptrigger。由于代码中没有提到main方法,它怎么会知道如何执行program.cs文件。请注意,我仍在本地运行它。如何在这个 http 触发器中调用 main 方法。不能自己调用​​
  • 无法自行调用 Azure 函数。他们正在等待触发。并且有不同的触发因素。如果使用 HttpTrigger,Azure 函数将公开一个常规端点,以便您可以通过常规 http GET/POST/.. 调用来调用它们。关于 main 方法,将控制台应用程序的 main 方法的代码移至此处的“运行”方法。然后您可以使用以下答案中提到的解决方案。
  • @JustShadow 我可以只使用时间触发器而不使用httptrigger。所以我所做的就是在 Azure Function 的 run 方法中添加了 main 方法的代码。当我按下 F5 时,它开始工作,但是它给了我一个与应用程序洞察相关的异常。但是让我们忽略这个异常,它实际上在没有 httptrigger 的情况下工作?
  • 当然你可以只使用timertrigger,但在这种情况下按下F5后,你需要等待你在代码中提到的适当时间(“0 0 */1 * * *")。不会一按F5就触发

标签: c# .net azure azure-functions


【解决方案1】:

Azure 函数本质上是事件驱动的。如果函数触发意味着事件被处理。

函数的run方法表示函数已触发及其入口点。

如果您想要在此之前进行任何处理或代码执行,您可能需要再编写一个函数并执行这些步骤,然后触发另一个定时器触发器或不同类型的函数。

【讨论】:

  • 在定时器触发之前我应该​​使用什么样的函数来运行 program.cs 文件? program.cs 文件包含从数据库中检索数据并查询它并上传到 azure 的所有信息。我的问题是我该怎么做?如何首先在 azure 函数中运行 program.cs 文件,然后调用计时器触发器。我应该添加哪一行代码?
【解决方案2】:

有一些解决方案可以实现这一点。

解决方法一、将定时器触发器暂时替换为http触发器

在调试应用程序时,我们只需注释原始 Run 函数的第一行并添加一个 http 触发器,如下所示:

public static async Task Run([HttpTrigger] Microsoft.AspNetCore.Http.HttpRequest req, ILogger log)
// public static async Task Run([TimerTrigger("0 0 * * * *")] TimerInfo myTimer, ILogger log)
{
   // YOUR REGULAR CODE HERE
}

然后在运行应用程序时,您会看到这样的端点:

只需在浏览器(或邮递员)中打开端点,该函数就会被调用。

将代码推送到 repo 之前,只需带回原来的 Run 函数并删除 http 触发器。

解决方案 2:添加另一个调用计时器函数的 http 触发器
将以下函数添加到您的应用中以公开 http 触发器。

        [FunctionName("Test")]
        public static async Task Test([HttpTrigger] Microsoft.AspNetCore.Http.HttpRequest req, ILogger log)
        {
            Run(null, log);
        }

该函数基本上调用Run 函数。 因此,当您运行应用程序时,您将再次从控制台获得一个端点,该端点可用于从浏览器中触发该功能。 网址将如下所示:
http://localhost:7071/api/Test

【讨论】:

  • 感谢您的回答。让我澄清一下我的问题。我在解决方案资源管理器中有我的函数应用程序。在其中,我复制了控制台应用程序的所有代码。控制台应用程序从 program.cs 文件运行。在代码的某处,我告诉程序等待 1 小时,然后重新开始。所以我首先需要的是在 azure 函数中运行 program.cs 文件。我的问题是如何让它在触发器之前运行。我应该添加什么代码来调用它,作为最后一步我应该触发时间表
  • 您可以将“解决方案2”中提到的代码添加到您的代码中,然后在运行应用程序后,在浏览器中打开以下内容以触发功能http://localhost:7071/api/Test
  • 这个定时器触发器是如何工作的。你提到如果 timertrigger 设置为 1 小时并且我按 f5 它将在 1 小时后启动。就我而言,我希望 Main 方法在完成其工作后第一次运行,计时器触发器将延迟 1 小时,并且在该小时过去后 Main 方法应该再次启动。我希望它是递归的,就好像它永远不会结束一样。示例:首先是主方法启动,然后定时器触发延迟 1 小时,然后主方法再次启动,然后定时器触发延迟 1 小时等(永不停止),因为它将部署在 azure...
  • 遗憾的是,在本地开发时,Azure 没有提供这样的功能,即在您按 F5 时自动运行代码。您必须使用触发器,但它们都没有提供该选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2019-01-30
相关资源
最近更新 更多