diff --git a/release_notes.md b/release_notes.md index a39623b2f..adfc5a077 100644 --- a/release_notes.md +++ b/release_notes.md @@ -6,6 +6,8 @@ ### Bug Fixes +- Check if function invocation already has an executor before registering durable executor. (#3265) + ### Breaking Changes ### Dependency Updates diff --git a/src/Worker.Extensions.DurableTask/DurableTaskFunctionsMiddleware.cs b/src/Worker.Extensions.DurableTask/DurableTaskFunctionsMiddleware.cs index 0e9f0651c..83e4eed96 100644 --- a/src/Worker.Extensions.DurableTask/DurableTaskFunctionsMiddleware.cs +++ b/src/Worker.Extensions.DurableTask/DurableTaskFunctionsMiddleware.cs @@ -16,9 +16,9 @@ internal class DurableTaskFunctionsMiddleware(DurableFunctionExecutor invoker) : /// public Task Invoke(FunctionContext functionContext, FunctionExecutionDelegate next) { - if (functionContext.TryGetOrchestrationBinding(out _) - || functionContext.TryGetEntityBinding(out _) - || functionContext.TryGetActivityBinding(out _)) + // If the function is a Durable Task function and there is no executor registered yet, + // register the Durable Function executor. + if (functionContext.Features.Get() is null && functionContext.IsDurableTaskFunction()) { functionContext.Features.Set(invoker); } diff --git a/src/Worker.Extensions.DurableTask/FunctionContextExtensions.cs b/src/Worker.Extensions.DurableTask/FunctionContextExtensions.cs index a09ed101a..af3355286 100644 --- a/src/Worker.Extensions.DurableTask/FunctionContextExtensions.cs +++ b/src/Worker.Extensions.DurableTask/FunctionContextExtensions.cs @@ -11,6 +11,16 @@ namespace Microsoft.Azure.Functions.Worker.Extensions.DurableTask; internal static class FunctionContextExtensions { + /// + /// Determines whether the function context represents a Durable Task function. + /// + /// The function context. + /// True if function is a durable task trigger, false otherwise. + public static bool IsDurableTaskFunction(this FunctionContext context) + => context.TryGetOrchestrationBinding(out _) + || context.TryGetActivityBinding(out _) + || context.TryGetEntityBinding(out _); + /// /// Tries to get the orchestration trigger binding from the function context. ///