diff --git a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.cs b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.cs
index 59c2ec0dd..1e2464b81 100644
--- a/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.cs
+++ b/src/modules/Elsa.Workflows.Core/Contexts/ActivityExecutionContext.cs
@@ -470,15 +470,9 @@ public class ActivityExecutionContext : IExecutionContext
/// The memory block does not exist.
public object? Get(MemoryBlockReference blockReference)
{
- var memoryBlock = GetMemoryBlock(blockReference);
-
- if (memoryBlock != null)
- return memoryBlock.Value;
-
- if (blockReference is Literal literal)
- return literal.Value;
-
- throw new InvalidOperationException($"The memory block '{blockReference}' does not exist.");
+ return !TryGet(blockReference, out var value)
+ ? throw new InvalidOperationException($"The memory block '{blockReference}' does not exist.")
+ : value;
}
///
@@ -493,6 +487,32 @@ public class ActivityExecutionContext : IExecutionContext
return value != default ? value.ConvertTo() : default;
}
+ ///
+ /// Tries to get the value of the specified memory block.
+ ///
+ /// The memory block reference.
+ /// The memory block value.
+ /// True if the memory block exists, false otherwise.
+ public bool TryGet(MemoryBlockReference blockReference, out object? value)
+ {
+ var memoryBlock = GetMemoryBlock(blockReference);
+
+ if (memoryBlock != null)
+ {
+ value = memoryBlock.Value;
+ return true;
+ }
+
+ if (blockReference is Literal literal)
+ {
+ value = literal.Value;
+ return true;
+ }
+
+ value = null;
+ return false;
+ }
+
///
/// Sets a value at the specified memory block.
///
diff --git a/src/modules/Elsa.Workflows.Runtime/Middleware/Workflows/PersistActivityExecutionLogMiddleware.cs b/src/modules/Elsa.Workflows.Runtime/Middleware/Workflows/PersistActivityExecutionLogMiddleware.cs
index 5e116c277..f3b3181a7 100644
--- a/src/modules/Elsa.Workflows.Runtime/Middleware/Workflows/PersistActivityExecutionLogMiddleware.cs
+++ b/src/modules/Elsa.Workflows.Runtime/Middleware/Workflows/PersistActivityExecutionLogMiddleware.cs
@@ -1,6 +1,7 @@
using Elsa.Extensions;
using Elsa.Mediator.Contracts;
using Elsa.Workflows.Core;
+using Elsa.Workflows.Core.Models;
using Elsa.Workflows.Core.Pipelines.WorkflowExecution;
using Elsa.Workflows.Core.State;
using Elsa.Workflows.Runtime.Contracts;
@@ -48,7 +49,19 @@ public class PersistActivityExecutionLogMiddleware : WorkflowExecutionMiddleware
var expressionExecutionContext = activityExecutionContext.ExpressionExecutionContext;
var activityDescriptor = activityExecutionContext.ActivityDescriptor;
var outputDescriptors = activityDescriptor.Outputs;
- var outputs = outputDescriptors.ToDictionary(x => x.Name, x => activity.GetOutput(expressionExecutionContext, x.Name)!);
+
+ var outputs = outputDescriptors.ToDictionary(x => x.Name, x =>
+ {
+ var cachedValue = activity.GetOutput(expressionExecutionContext, x.Name);
+
+ if(cachedValue != default)
+ return cachedValue;
+
+ if(x.ValueGetter(activity) is Output output && activityExecutionContext.TryGet(output.MemoryBlockReference(), out var outputValue))
+ return outputValue;
+
+ return default;
+ });
return new ActivityExecutionRecord
{