From 19a8d8d4e5ac4baf46900f5541580b5cf9fb3de2 Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Sat, 13 Dec 2025 12:10:37 -0800 Subject: [PATCH 1/9] Add ExceptionPropertiesSample demonstrating IExceptionPropertiesProvider usage --- .../CustomExceptionPropertiesProvider.cs | 45 +++++++ .../CustomExceptions.cs | 38 ++++++ .../ExceptionPropertiesSample.csproj | 26 ++++ samples/ExceptionPropertiesSample/Program.cs | 119 ++++++++++++++++++ samples/ExceptionPropertiesSample/README.md | 70 +++++++++++ samples/ExceptionPropertiesSample/Tasks.cs | 73 +++++++++++ 6 files changed, 371 insertions(+) create mode 100644 samples/ExceptionPropertiesSample/CustomExceptionPropertiesProvider.cs create mode 100644 samples/ExceptionPropertiesSample/CustomExceptions.cs create mode 100644 samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj create mode 100644 samples/ExceptionPropertiesSample/Program.cs create mode 100644 samples/ExceptionPropertiesSample/README.md create mode 100644 samples/ExceptionPropertiesSample/Tasks.cs diff --git a/samples/ExceptionPropertiesSample/CustomExceptionPropertiesProvider.cs b/samples/ExceptionPropertiesSample/CustomExceptionPropertiesProvider.cs new file mode 100644 index 00000000..7273d133 --- /dev/null +++ b/samples/ExceptionPropertiesSample/CustomExceptionPropertiesProvider.cs @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.DurableTask.Worker; + +namespace ExceptionPropertiesSample; + +/// +/// Custom exception properties provider that extracts additional properties from exceptions +/// to include in TaskFailureDetails for better diagnostics and error handling. +/// +public class CustomExceptionPropertiesProvider : IExceptionPropertiesProvider +{ + /// + /// Extracts custom properties from exceptions to enrich failure details. + /// + /// The exception to extract properties from. + /// + /// A dictionary of custom properties to include in the FailureDetails, + /// or null if no properties should be added for this exception type. + /// + public IDictionary? GetExceptionProperties(Exception exception) + { + return exception switch + { + BusinessValidationException businessEx => new Dictionary + { + ["ErrorCode"] = businessEx.ErrorCode, + ["StatusCode"] = businessEx.StatusCode, + ["Metadata"] = businessEx.Metadata, + }, + ArgumentOutOfRangeException argEx => new Dictionary + { + ["ParameterName"] = argEx.ParamName ?? string.Empty, + ["ActualValue"] = argEx.ActualValue?.ToString() ?? string.Empty, + }, + ArgumentNullException argNullEx => new Dictionary + { + ["ParameterName"] = argNullEx.ParamName ?? string.Empty, + }, + _ => null // No custom properties for other exception types + }; + } +} + diff --git a/samples/ExceptionPropertiesSample/CustomExceptions.cs b/samples/ExceptionPropertiesSample/CustomExceptions.cs new file mode 100644 index 00000000..19e91f0a --- /dev/null +++ b/samples/ExceptionPropertiesSample/CustomExceptions.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace ExceptionPropertiesSample; + +/// +/// Custom business exception that includes additional properties for better error diagnostics. +/// +public class BusinessValidationException : Exception +{ + public BusinessValidationException( + string message, + string? errorCode = null, + int? statusCode = null, + Dictionary? metadata = null) + : base(message) + { + this.ErrorCode = errorCode; + this.StatusCode = statusCode; + this.Metadata = metadata ?? new Dictionary(); + } + + /// + /// Gets the error code associated with this validation failure. + /// + public string? ErrorCode { get; } + + /// + /// Gets the HTTP status code that should be returned for this error. + /// + public int? StatusCode { get; } + + /// + /// Gets additional metadata about the validation failure. + /// + public Dictionary Metadata { get; } +} + diff --git a/samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj b/samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj new file mode 100644 index 00000000..ac8e147f --- /dev/null +++ b/samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj @@ -0,0 +1,26 @@ + + + + Exe + net6.0;net8.0;net10.0 + enable + + + + + + + + + + + + + + + + + diff --git a/samples/ExceptionPropertiesSample/Program.cs b/samples/ExceptionPropertiesSample/Program.cs new file mode 100644 index 00000000..d4feb9c8 --- /dev/null +++ b/samples/ExceptionPropertiesSample/Program.cs @@ -0,0 +1,119 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// This sample demonstrates how to use IExceptionPropertiesProvider to enrich +// TaskFailureDetails with custom exception properties for better diagnostics. + +using ExceptionPropertiesSample; +using Microsoft.DurableTask.Client; +using Microsoft.DurableTask.Worker; +using Microsoft.Extensions.Hosting; + +HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); + +// Register the durable task client +builder.Services.AddDurableTaskClient().UseGrpc(); + +// Register the durable task worker with custom exception properties provider +builder.Services.AddDurableTaskWorker() + .AddTasks(tasks => + { + tasks.AddOrchestrator(); + tasks.AddActivity(); + }) + .UseGrpc(); + +// Register the custom exception properties provider +// This will automatically extract custom properties from exceptions and include them in TaskFailureDetails +builder.Services.AddSingleton(); + +IHost host = builder.Build(); + +// Start the worker +await host.StartAsync(); + +// Get the client to start orchestrations +DurableTaskClient client = host.Services.GetRequiredService(); + +Console.WriteLine("Exception Properties Sample"); +Console.WriteLine("==========================="); +Console.WriteLine(); + +// Test case 1: Valid input (should succeed) +Console.WriteLine("Test 1: Valid input"); +string instanceId1 = await client.ScheduleNewOrchestrationInstanceAsync( + "ValidationOrchestration", + input: "Hello World"); + +OrchestrationMetadata result1 = await client.WaitForInstanceCompletionAsync( + instanceId1, + getInputsAndOutputs: true); + +if (result1.RuntimeStatus == OrchestrationRuntimeStatus.Completed) +{ + Console.WriteLine($"✓ Orchestration completed successfully"); + Console.WriteLine($" Output: {result1.ReadOutputAs()}"); +} +Console.WriteLine(); + +// Test case 2: Empty input (should fail with custom properties) +Console.WriteLine("Test 2: Empty input (should fail)"); +string instanceId2 = await client.ScheduleNewOrchestrationInstanceAsync( + "ValidationOrchestration", + input: string.Empty); + +OrchestrationMetadata result2 = await client.WaitForInstanceCompletionAsync( + instanceId2, + getInputsAndOutputs: true); + +if (result2.RuntimeStatus == OrchestrationRuntimeStatus.Failed && result2.FailureDetails != null) +{ + Console.WriteLine($"✗ Orchestration failed as expected"); + Console.WriteLine($" Error Type: {result2.FailureDetails.ErrorType}"); + Console.WriteLine($" Error Message: {result2.FailureDetails.ErrorMessage}"); + + // Display custom properties that were extracted by IExceptionPropertiesProvider + if (result2.FailureDetails.Properties != null && result2.FailureDetails.Properties.Count > 0) + { + Console.WriteLine($" Custom Properties:"); + foreach (var property in result2.FailureDetails.Properties) + { + Console.WriteLine($" - {property.Key}: {property.Value}"); + } + } +} +Console.WriteLine(); + +// Test case 3: Short input (should fail with different custom properties) +Console.WriteLine("Test 3: Short input (should fail)"); +string instanceId3 = await client.ScheduleNewOrchestrationInstanceAsync( + "ValidationOrchestration", + input: "Hi"); + +OrchestrationMetadata result3 = await client.WaitForInstanceCompletionAsync( + instanceId3, + getInputsAndOutputs: true); + +if (result3.RuntimeStatus == OrchestrationRuntimeStatus.Failed && result3.FailureDetails != null) +{ + Console.WriteLine($"✗ Orchestration failed as expected"); + Console.WriteLine($" Error Type: {result3.FailureDetails.ErrorType}"); + Console.WriteLine($" Error Message: {result3.FailureDetails.ErrorMessage}"); + + // Display custom properties + if (result3.FailureDetails.Properties != null && result3.FailureDetails.Properties.Count > 0) + { + Console.WriteLine($" Custom Properties:"); + foreach (var property in result3.FailureDetails.Properties) + { + Console.WriteLine($" - {property.Key}: {property.Value}"); + } + } +} +Console.WriteLine(); + +Console.WriteLine("Sample completed. Press any key to exit..."); +Console.ReadKey(); + +await host.StopAsync(); + diff --git a/samples/ExceptionPropertiesSample/README.md b/samples/ExceptionPropertiesSample/README.md new file mode 100644 index 00000000..128cc41b --- /dev/null +++ b/samples/ExceptionPropertiesSample/README.md @@ -0,0 +1,70 @@ +# Exception Properties Sample + +This sample demonstrates how to use `IExceptionPropertiesProvider` to enrich `TaskFailureDetails` with custom exception properties for better diagnostics and error handling. + +## Overview + +When orchestrations or activities throw exceptions, the Durable Task framework captures failure details. By implementing `IExceptionPropertiesProvider`, you can extract custom properties from exceptions and include them in the `TaskFailureDetails`, making it easier to diagnose issues and handle errors programmatically. + +## Key Concepts + +1. **Custom Exception with Properties**: Create exceptions that carry additional context (error codes, metadata, etc.) +2. **IExceptionPropertiesProvider**: Implement this interface to extract custom properties from exceptions +3. **Automatic Property Extraction**: The framework automatically uses your provider when converting exceptions to `TaskFailureDetails` +4. **Retrieving Failure Details**: Use the durable client to retrieve orchestration status and access the enriched failure details + +## What This Sample Does + +1. Defines a `BusinessValidationException` with custom properties (ErrorCode, StatusCode, Metadata) +2. Implements `CustomExceptionPropertiesProvider` that extracts these properties from exceptions +3. Creates a validation orchestration and activity that throws the custom exception +4. Demonstrates how to retrieve and display failure details with custom properties using the durable client + +## Running the Sample + +```bash +dotnet run --project ExceptionPropertiesSample +``` + +## Expected Output + +The sample runs three test cases: +1. **Valid input**: Orchestration completes successfully +2. **Empty input**: Orchestration fails with custom properties (ErrorCode, StatusCode, Metadata) +3. **Short input**: Orchestration fails with different custom properties + +For failed orchestrations, you'll see the custom properties extracted by the `IExceptionPropertiesProvider` displayed in the console. + +## Code Structure + +- `CustomExceptions.cs`: Defines the `BusinessValidationException` with custom properties +- `CustomExceptionPropertiesProvider.cs`: Implements `IExceptionPropertiesProvider` to extract properties +- `Tasks.cs`: Contains the orchestration and activity that throw custom exceptions +- `Program.cs`: Sets up the worker, registers the provider, and demonstrates retrieving failure details + +## Key Code Snippet + +```csharp +// Register the custom exception properties provider +builder.Services.AddSingleton(); + +// Retrieve failure details with custom properties +OrchestrationMetadata result = await client.WaitForInstanceCompletionAsync( + instanceId, + getInputsAndOutputs: true); // Important: must be true to get failure details + +if (result.FailureDetails?.Properties != null) +{ + foreach (var property in result.FailureDetails.Properties) + { + Console.WriteLine($"{property.Key}: {property.Value}"); + } +} +``` + +## Notes + +- The `getInputsAndOutputs` parameter must be `true` when calling `GetInstanceAsync` or `WaitForInstanceCompletionAsync` to retrieve failure details +- Custom properties are only included if the orchestration is in a `Failed` state +- The `IExceptionPropertiesProvider` is called automatically by the framework when exceptions are caught + diff --git a/samples/ExceptionPropertiesSample/Tasks.cs b/samples/ExceptionPropertiesSample/Tasks.cs new file mode 100644 index 00000000..e919aad7 --- /dev/null +++ b/samples/ExceptionPropertiesSample/Tasks.cs @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.DurableTask; + +namespace ExceptionPropertiesSample; + +/// +/// Orchestration that demonstrates custom exception properties in failure details. +/// +[DurableTask("ValidationOrchestration")] +public class ValidationOrchestration : TaskOrchestrator +{ + public override async Task RunAsync(TaskOrchestrationContext context, string input) + { + // Call an activity that may throw a custom exception with properties + try + { + string result = await context.CallActivityAsync("ValidateInput", input); + return result; + } + catch (TaskFailedException ex) + { + // The failure details will include custom properties from IExceptionPropertiesProvider + // These properties are automatically extracted and included in the TaskFailureDetails + throw; + } + } +} + +/// +/// Activity that validates input and throws a custom exception with properties on failure. +/// +[DurableTask("ValidateInput")] +public class ValidateInputActivity : TaskActivity +{ + public override Task RunAsync(TaskActivityContext context, string input) + { + // Simulate validation logic + if (string.IsNullOrWhiteSpace(input)) + { + throw new BusinessValidationException( + message: "Input validation failed: input cannot be empty", + errorCode: "VALIDATION_001", + statusCode: 400, + metadata: new Dictionary + { + ["Field"] = "input", + ["ValidationRule"] = "Required", + ["Timestamp"] = DateTime.UtcNow, + }); + } + + if (input.Length < 3) + { + throw new BusinessValidationException( + message: $"Input validation failed: input must be at least 3 characters (received {input.Length})", + errorCode: "VALIDATION_002", + statusCode: 400, + metadata: new Dictionary + { + ["Field"] = "input", + ["ValidationRule"] = "MinLength", + ["MinLength"] = 3, + ["ActualLength"] = input.Length, + }); + } + + // Validation passed + return Task.FromResult($"Validation successful for input: {input}"); + } +} + From 4fd6d467da28d68e41177b736d59aaf7c8a9dab0 Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Sat, 13 Dec 2025 12:28:50 -0800 Subject: [PATCH 2/9] fix --- .../ExceptionPropertiesSample.csproj | 2 + samples/ExceptionPropertiesSample/Program.cs | 49 ++++++++++++++++--- samples/ExceptionPropertiesSample/README.md | 14 ++++++ .../appsettings.json | 3 ++ 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 samples/ExceptionPropertiesSample/appsettings.json diff --git a/samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj b/samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj index ac8e147f..d24b2f47 100644 --- a/samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj +++ b/samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj @@ -19,7 +19,9 @@ + + diff --git a/samples/ExceptionPropertiesSample/Program.cs b/samples/ExceptionPropertiesSample/Program.cs index d4feb9c8..6d805ff8 100644 --- a/samples/ExceptionPropertiesSample/Program.cs +++ b/samples/ExceptionPropertiesSample/Program.cs @@ -5,23 +5,53 @@ // TaskFailureDetails with custom exception properties for better diagnostics. using ExceptionPropertiesSample; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.DurableTask.Client; +using Microsoft.DurableTask.Client.AzureManaged; using Microsoft.DurableTask.Worker; +using Microsoft.DurableTask.Worker.AzureManaged; using Microsoft.Extensions.Hosting; HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); +string? schedulerConnectionString = builder.Configuration.GetValue("DURABLE_TASK_SCHEDULER_CONNECTION_STRING"); +bool useScheduler = !string.IsNullOrWhiteSpace(schedulerConnectionString); + // Register the durable task client -builder.Services.AddDurableTaskClient().UseGrpc(); +if (useScheduler) +{ + builder.Services.AddDurableTaskClient(clientBuilder => clientBuilder.UseDurableTaskScheduler(schedulerConnectionString!)); +} +else +{ + builder.Services.AddDurableTaskClient().UseGrpc(); +} // Register the durable task worker with custom exception properties provider -builder.Services.AddDurableTaskWorker() - .AddTasks(tasks => +if (useScheduler) +{ + builder.Services.AddDurableTaskWorker(workerBuilder => { - tasks.AddOrchestrator(); - tasks.AddActivity(); - }) - .UseGrpc(); + workerBuilder.AddTasks(tasks => + { + tasks.AddOrchestrator(); + tasks.AddActivity(); + }); + + workerBuilder.UseDurableTaskScheduler(schedulerConnectionString!); + }); +} +else +{ + builder.Services.AddDurableTaskWorker() + .AddTasks(tasks => + { + tasks.AddOrchestrator(); + tasks.AddActivity(); + }) + .UseGrpc(); +} // Register the custom exception properties provider // This will automatically extract custom properties from exceptions and include them in TaskFailureDetails @@ -39,6 +69,11 @@ Console.WriteLine("==========================="); Console.WriteLine(); +Console.WriteLine(useScheduler + ? "Configured to use Durable Task Scheduler (DTS)." + : "Configured to use local gRPC. (Set DURABLE_TASK_SCHEDULER_CONNECTION_STRING to use DTS.)"); +Console.WriteLine(); + // Test case 1: Valid input (should succeed) Console.WriteLine("Test 1: Valid input"); string instanceId1 = await client.ScheduleNewOrchestrationInstanceAsync( diff --git a/samples/ExceptionPropertiesSample/README.md b/samples/ExceptionPropertiesSample/README.md index 128cc41b..f1fba1d1 100644 --- a/samples/ExceptionPropertiesSample/README.md +++ b/samples/ExceptionPropertiesSample/README.md @@ -22,6 +22,20 @@ When orchestrations or activities throw exceptions, the Durable Task framework c ## Running the Sample +This sample can run against either: + +1. **Durable Task Scheduler (DTS)** (recommended): set the `DURABLE_TASK_SCHEDULER_CONNECTION_STRING` environment variable. +2. **Local gRPC endpoint**: if the env var is not set, the sample uses the default local gRPC configuration. + +### DTS + +Set `DURABLE_TASK_SCHEDULER_CONNECTION_STRING` and run the sample. + +```cmd +set DURABLE_TASK_SCHEDULER_CONNECTION_STRING=Endpoint=https://...;TaskHub=...;Authentication=...; +dotnet run --project ExceptionPropertiesSample +``` + ```bash dotnet run --project ExceptionPropertiesSample ``` diff --git a/samples/ExceptionPropertiesSample/appsettings.json b/samples/ExceptionPropertiesSample/appsettings.json new file mode 100644 index 00000000..1aab2378 --- /dev/null +++ b/samples/ExceptionPropertiesSample/appsettings.json @@ -0,0 +1,3 @@ +{ + "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "" +} \ No newline at end of file From 262d9fc259cacb4418fd4c0baeb91a646260dffb Mon Sep 17 00:00:00 2001 From: wangbill Date: Sat, 13 Dec 2025 12:59:00 -0800 Subject: [PATCH 3/9] Potential fix for pull request finding 'Useless assignment to local variable' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> --- samples/ExceptionPropertiesSample/Tasks.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/ExceptionPropertiesSample/Tasks.cs b/samples/ExceptionPropertiesSample/Tasks.cs index e919aad7..caafe886 100644 --- a/samples/ExceptionPropertiesSample/Tasks.cs +++ b/samples/ExceptionPropertiesSample/Tasks.cs @@ -19,7 +19,7 @@ public override async Task RunAsync(TaskOrchestrationContext context, st string result = await context.CallActivityAsync("ValidateInput", input); return result; } - catch (TaskFailedException ex) + catch (TaskFailedException) { // The failure details will include custom properties from IExceptionPropertiesProvider // These properties are automatically extracted and included in the TaskFailureDetails From 41ee8174b7407a95452fd7c0f6aafb25bc4562ae Mon Sep 17 00:00:00 2001 From: wangbill Date: Sat, 13 Dec 2025 12:59:33 -0800 Subject: [PATCH 4/9] Update samples/ExceptionPropertiesSample/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- samples/ExceptionPropertiesSample/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/ExceptionPropertiesSample/README.md b/samples/ExceptionPropertiesSample/README.md index f1fba1d1..9b2d4ff2 100644 --- a/samples/ExceptionPropertiesSample/README.md +++ b/samples/ExceptionPropertiesSample/README.md @@ -37,7 +37,7 @@ dotnet run --project ExceptionPropertiesSample ``` ```bash -dotnet run --project ExceptionPropertiesSample +dotnet run --project samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj ``` ## Expected Output From 7320bad73db5fe2f02745e2c7a560540c35e321d Mon Sep 17 00:00:00 2001 From: wangbill Date: Sat, 13 Dec 2025 12:59:51 -0800 Subject: [PATCH 5/9] Update samples/ExceptionPropertiesSample/Tasks.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- samples/ExceptionPropertiesSample/Tasks.cs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/samples/ExceptionPropertiesSample/Tasks.cs b/samples/ExceptionPropertiesSample/Tasks.cs index caafe886..50c7d289 100644 --- a/samples/ExceptionPropertiesSample/Tasks.cs +++ b/samples/ExceptionPropertiesSample/Tasks.cs @@ -14,17 +14,8 @@ public class ValidationOrchestration : TaskOrchestrator public override async Task RunAsync(TaskOrchestrationContext context, string input) { // Call an activity that may throw a custom exception with properties - try - { - string result = await context.CallActivityAsync("ValidateInput", input); - return result; - } - catch (TaskFailedException) - { - // The failure details will include custom properties from IExceptionPropertiesProvider - // These properties are automatically extracted and included in the TaskFailureDetails - throw; - } + string result = await context.CallActivityAsync("ValidateInput", input); + return result; } } From 1e8962dd4e78a80a41131692082abe134a8da6cf Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Sat, 13 Dec 2025 13:04:49 -0800 Subject: [PATCH 6/9] sln --- Microsoft.DurableTask.sln | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Microsoft.DurableTask.sln b/Microsoft.DurableTask.sln index 0ca1cad1..837a0ba0 100644 --- a/Microsoft.DurableTask.sln +++ b/Microsoft.DurableTask.sln @@ -93,6 +93,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScheduledTasks.Tests", "tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LargePayloadConsoleApp", "samples\LargePayloadConsoleApp\LargePayloadConsoleApp.csproj", "{6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExceptionPropertiesSample", "samples\ExceptionPropertiesSample\ExceptionPropertiesSample.csproj", "{7C3ECBCE-BEFB-4982-842E-B654BB6B6285}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureBlobPayloads", "src\Extensions\AzureBlobPayloads\AzureBlobPayloads.csproj", "{FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InProcessTestHost", "src\InProcessTestHost\InProcessTestHost.csproj", "{5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}" @@ -261,6 +263,10 @@ Global {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.Build.0 = Debug|Any CPU {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.ActiveCfg = Release|Any CPU {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.Build.0 = Release|Any CPU + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285}.Release|Any CPU.Build.0 = Release|Any CPU {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.Build.0 = Debug|Any CPU {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -313,6 +319,7 @@ Global {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} {B894780C-338F-475E-8E84-56AFA8197A06} = {E5637F81-2FB9-4CD7-900D-455363B142A7} {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution From 113ed7d87b5b0a9c0d613d25d6801a5141bd58e5 Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Sat, 13 Dec 2025 13:05:56 -0800 Subject: [PATCH 7/9] remove appsettings --- samples/ExceptionPropertiesSample/appsettings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 samples/ExceptionPropertiesSample/appsettings.json diff --git a/samples/ExceptionPropertiesSample/appsettings.json b/samples/ExceptionPropertiesSample/appsettings.json deleted file mode 100644 index 1aab2378..00000000 --- a/samples/ExceptionPropertiesSample/appsettings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "" -} \ No newline at end of file From b5ef75efe3af6588609958a2dd4e8858f4a9330c Mon Sep 17 00:00:00 2001 From: wangbill Date: Sat, 13 Dec 2025 13:06:58 -0800 Subject: [PATCH 8/9] Update samples/ExceptionPropertiesSample/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- samples/ExceptionPropertiesSample/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/ExceptionPropertiesSample/README.md b/samples/ExceptionPropertiesSample/README.md index 9b2d4ff2..27f993b7 100644 --- a/samples/ExceptionPropertiesSample/README.md +++ b/samples/ExceptionPropertiesSample/README.md @@ -33,7 +33,7 @@ Set `DURABLE_TASK_SCHEDULER_CONNECTION_STRING` and run the sample. ```cmd set DURABLE_TASK_SCHEDULER_CONNECTION_STRING=Endpoint=https://...;TaskHub=...;Authentication=...; -dotnet run --project ExceptionPropertiesSample +dotnet run --project samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj ``` ```bash From 4d7606c49005c4f800042895355ae44525ea87ea Mon Sep 17 00:00:00 2001 From: wangbill Date: Sat, 13 Dec 2025 13:07:12 -0800 Subject: [PATCH 9/9] Update samples/ExceptionPropertiesSample/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- samples/ExceptionPropertiesSample/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/ExceptionPropertiesSample/README.md b/samples/ExceptionPropertiesSample/README.md index 27f993b7..a9ff13db 100644 --- a/samples/ExceptionPropertiesSample/README.md +++ b/samples/ExceptionPropertiesSample/README.md @@ -37,6 +37,7 @@ dotnet run --project samples/ExceptionPropertiesSample/ExceptionPropertiesSample ``` ```bash +export DURABLE_TASK_SCHEDULER_CONNECTION_STRING="Endpoint=https://...;TaskHub=...;Authentication=...;" dotnet run --project samples/ExceptionPropertiesSample/ExceptionPropertiesSample.csproj ```