rip*_*ey_ 40 c# timer azure azure-functions
我有几个C#Azure函数使用计时器触发器按计划运行.我已经设置了它们,在%TimerSchedule%
应用程序设置中指的是cron表达式:
public static void Run([TimerTrigger("%TimerSchedule%")]TimerInfo myTimer, TraceWriter log)
Run Code Online (Sandbox Code Playgroud)
在开发过程中,我经常希望使用Azure功能工具为Visual Studio + Azure功能核心工具在本地运行这些功能.但是,当我按F5调试本地函数时,它(通常)不会立即运行.相反,它根据计时器计划开始等待下一次出现.因此,例如,如果我的cron表达式表示每天晚上8点运行,我必须等到晚上8点才能在我的机器上实际运行该功能.
所以我的问题是:在本地运行一次函数的最简单和最好的方法是什么?
我尝试或考虑过的事情:
Run()
方法
的控制台应用程序或单元测试TimerInfo
和TraceWriter
参数Run()
- 而且我发现了很少的文档.Microsoft 在Azure功能页面中测试代码的策略对此主题没有太大帮助 - 它只提到计时器触发器作为测试其他触发器类型的方法.
在一个完美的世界里,我会点击F5并且该功能会立即运行一次 - 就像开发一个"普通"的.NET应用程序一样.
Wah*_*uen 60
您也许可以使用此处RunOnStartup
记录的标志.它不完全符合你关于它只运行一次的简要说明,但它应该至少在应用程序启动后在本地执行它.
Run Code Online (Sandbox Code Playgroud)/// Gets or sets a value indicating whether the function should be invoked /// immediately on startup. After the initial startup run, the function will /// be run on schedule thereafter.
使用属性绑定的示例:
[TimerTrigger("%TimerSchedule%", RunOnStartup = true)]TimerInfo myTimer
Nis*_*san 59
非 HTTP 触发函数
对于除 HTTP 触发器和 webhook 之外的所有类型的功能,您可以通过调用管理端点在本地测试您的功能。在本地服务器上使用 HTTP POST 请求调用此端点会触发该函数。您可以选择将测试数据传递给 POST 请求正文中的执行。此功能类似于 Azure 门户中的“测试”选项卡。
您调用以下管理员端点来触发非 HTTP 函数:
http://localhost:{port}/admin/functions/{function_name}
要将测试数据传递给函数的管理员端点,您必须在 POST 请求消息的正文中提供数据。消息正文需要具有以下 JSON 格式:
{
"input": "<trigger_input>"
}
Run Code Online (Sandbox Code Playgroud)
小智 39
我有同样的问题,并且在调试时只使用了DEBUG-flag来运行RunOnStartup:
public static void Run(
[TimerTrigger("* 0 7 * * 1-5"
#if DEBUG
, RunOnStartup=true
#endif
)]TimerInfo myTimer, TraceWriter log)
{
Run Code Online (Sandbox Code Playgroud)
Ren*_*sak 13
Local Project
,找到要运行的函数,右键单击,然后选择“立即执行函数”。查看此 MS快速入门指南。
使用这个curl命令启动你的函数
curl --request POST -H "Content-Type:application/json" --data '{"input":""}' http://localhost:7071/admin/functions/{function_name}
Run Code Online (Sandbox Code Playgroud)
输入数据是必需的,没有输入数据将不会触发该功能。
使用邮递员应该可以解决问题。按照以下步骤在本地运行或调试您的定时器触发器。
1 . 运行你的项目。
打开 Postman 并通过此 url http://localhost:{port}/admin/functions/{function_name}
确保使用带有 { "input": "" } 的 Json 主体的 POST 方法
按发送。
您应该收到 202 的响应。
我有同样的问题。我用 Unittest 修复了它。实际上,您需要删除 TraceWriter 和 TimerInfo。
这里有一些代码我是如何做到这一点的。
定时器信息:
public class ScheduleStub : TimerInfo
{
public ScheduleStub(TimerSchedule schedule, ScheduleStatus status, bool isPastDue = false) : base(schedule, status, isPastDue)
{
}
}
Run Code Online (Sandbox Code Playgroud)
和 TraceWriter:
public class TraceWriterStub : TraceWriter
{
protected TraceLevel _level;
protected List<TraceEvent> _traces;
public TraceWriterStub(TraceLevel level) : base(level)
{
_level = level;
_traces = new List<TraceEvent>();
}
public override void Trace(TraceEvent traceEvent)
{
_traces.Add(traceEvent);
}
public List<TraceEvent> Traces => _traces;
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是从 Postman 手动触发该函数:
手动运行非 HTTP 触发的函数。
POST /admin/functions/<function name> HTTP/1.1
Host: localhost:<port>
Content-Type: application/json
{}
Run Code Online (Sandbox Code Playgroud)
对我来说,它看起来像邮递员上名为timeTrigger 的函数Function1
: