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.
///