C# 持久函数可以有多个触发器吗?

C# 持久函数可以有多个触发器吗?,c#,azure-functions,azure-durable-functions,C#,Azure Functions,Azure Durable Functions,我有一个持久的功能,每天由计时器触发器触发一次: [FunctionName("MyDurableFunction")] public static async Task Run( [TimerTrigger("0 0 23 * * *", RunOnStartup = false)] TimerInfo myTimer, [OrchestrationClient] DurableOrchestrationClient starter, ILogger log) {

我有一个持久的功能,每天由计时器触发器触发一次:

[FunctionName("MyDurableFunction")]
public static async Task Run(
    [TimerTrigger("0 0 23 * * *", RunOnStartup = false)] TimerInfo myTimer,
    [OrchestrationClient] DurableOrchestrationClient starter,
    ILogger log)
{
    await starter.StartNewAsync("OrchestrationFunction", null);
}

[FunctionName("OrchestrationFunction")]
public static async Task OrchestrationFunction(
    [OrchestrationTrigger]DurableOrchestrationContext context,
    ILogger log)
{
    // do stuff
}
这个很好用。出于测试目的,我还希望能够通过Http触发器触发持久功能,因此我添加了以下内容:

[FunctionName("MyDurableFunctionHttpTrigger")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "demo")]HttpRequest req, 
    [OrchestrationClient] DurableOrchestrationClient starter, 
    ILogger log)
{
    await starter.StartNewAsync("OrchestrationFunction", null);
    return new OkObjectResult("blah");
}
[FunctionName(“MyDurableFunctionHttpTrigger”)]
公共静态异步任务运行(
[HttpTrigger(AuthorizationLevel.Anonymous,“get”,“post”,Route=“demo”)]HttpRequest请求,
[OrchestrationClient]DurableOrchestrationClient启动器,
ILogger日志)
{
等待starter.StartNewAsync(“OrchestrationFunction”,null);
返回新的OkObjectResult(“blah”);
}

在本地运行这些触发器(包括http触发器或计时器触发器)将触发函数,但在类中同时包含这两者意味着不会发生触发事件。是否可以让多个触发器类型启动业务流程触发器?

我相信每个函数只能有一个触发器类型,但可以建议您将所有逻辑写入单独的项目/程序集,然后引用程序集并通过参数调用入口点,保持您的函数实现干净、简单,并将执行逻辑集中在另一个项目(或同一项目中的类)中

在代码中,您应该有Orchestrator和Activity函数,因此您可以编写一个Activity函数来完成工作,并从两个Orchestrator调用它。关于持久功能的指导是保持编排器干净,并简单地管理编排,将工作转移到活动中


我建议您查看基于计时器的需求的,以及HTTP触发器的。

您可以创建多个普通函数,每种类型的触发器一个。计划触发器、http触发器、blob触发器或任何其他受支持的触发器

在该功能中,您可以启动新的编排功能。该编排功能本身不需要触发器。您只需要DurableOrchestrationContext

public static async Task<object> RunOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext context,
    ILogger log)
{
    // orchestration logic here
}

[FunctionName("Info_HttpStart1")]
public static async Task<HttpResponseMessage> HttpStart(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "starter1")]HttpRequestMessage req,
    [OrchestrationClient]DurableOrchestrationClient starter,
    ILogger log)
{
    // Function input comes from the request content.
    string instanceId = await starter.StartNewAsync("Info", null);

    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

    return starter.CreateCheckStatusResponse(req, instanceId);
}

[FunctionName("Info_HttpStart2")]
public static async Task<HttpResponseMessage> HttpStart(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "starter2")]HttpRequestMessage req,
    [OrchestrationClient]DurableOrchestrationClient starter,
    ILogger log)
{
    // Function input comes from the request content.
    string instanceId = await starter.StartNewAsync("Info", null);

    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

    return starter.CreateCheckStatusResponse(req, instanceId);
}
公共静态异步任务RunOrchestrator(
[OrchestrationTrigger]DurableOrchestrationContext上下文,
ILogger日志)
{
//这里的编排逻辑
}
[函数名(“Info_HttpStart1”)]
公共静态异步任务HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous,“get”,Route=“starter1”)]HttpRequestMessage请求,
[OrchestrationClient]DurableOrchestrationClient启动器,
ILogger日志)
{
//函数输入来自请求内容。
字符串instanceId=await starter.StartNewAsync(“Info”,null);
LogInformation($“启动了ID为“{instanceId}”的业务流程”;
返回starter.CreateCheckStatusResponse(请求,实例ID);
}
[FunctionName(“Info_HttpStart2”)]
公共静态异步任务HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous,“get”,Route=“starter2”)]HttpRequestMessage请求,
[OrchestrationClient]DurableOrchestrationClient启动器,
ILogger日志)
{
//函数输入来自请求内容。
字符串instanceId=await starter.StartNewAsync(“Info”,null);
LogInformation($“启动了ID为“{instanceId}”的业务流程”;
返回starter.CreateCheckStatusResponse(请求,实例ID);
}

谢谢。我很想知道技术限制是什么,我想不出任何概念上的原因来解释为什么orchestrator函数不能有多个触发器。我想不出任何技术上的原因(除了增加一点额外的复杂性)。