diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml
new file mode 100644
index 00000000..530ae749
--- /dev/null
+++ b/.github/workflows/copilot-setup-steps.yml
@@ -0,0 +1,36 @@
+name: "Copilot Setup Steps"
+
+# Automatically run the setup steps when they are changed to allow for easy validation, and
+# allow manual testing through the repository's "Actions" tab
+on:
+ workflow_dispatch:
+ push:
+ paths:
+ - .github/workflows/copilot-setup-steps.yml
+ pull_request:
+ paths:
+ - .github/workflows/copilot-setup-steps.yml
+
+jobs:
+ # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot.
+ copilot-setup-steps:
+ runs-on: ubuntu-latest
+
+ # Set the permissions to the lowest permissions possible needed for your steps.
+ # Copilot will be given its own token for its operations.
+ permissions:
+ # If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete.
+ contents: read
+
+ # You can define any steps you want, and they will run before the agent starts.
+ # If you do not check out your code, Copilot will do this for you.
+ steps:
+ - name: Install .NET 10.x
+ uses: actions/setup-dotnet@v5
+ with:
+ dotnet-version: |
+ 10.x
+ dotnet-quality: preview
+
+ - name: dotnet --info
+ run: dotnet --info
\ No newline at end of file
diff --git a/README.md b/README.md
index bd4a2c27..29b4f48e 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,7 @@ A C# .NET version based on [mock4net](https://github.com/alexvictoor/mock4net) w
| **WireMock.Net.MimePart** | [](https://www.nuget.org/packages/WireMock.Net.MimePart) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.MimePart)
| **WireMock.Net.GraphQL** | [](https://www.nuget.org/packages/WireMock.Net.GraphQL) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.GraphQL)
| **WireMock.Net.ProtoBuf** | [](https://www.nuget.org/packages/WireMock.Net.ProtoBuf) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.ProtoBuf)
+| **WireMock.Net.OpenTelemetry** | [](https://www.nuget.org/packages/WireMock.Net.ProtoBuf) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.OpenTelemetry)
| | | |
| **WireMock.Net.RestClient** | [](https://www.nuget.org/packages/WireMock.Net.RestClient) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Net.RestClient)
| **WireMock.Org.RestClient** | [](https://www.nuget.org/packages/WireMock.Org.RestClient) | [](https://www.myget.org/feed/wiremock-net/package/nuget/WireMock.Org.RestClient)
diff --git a/WireMock.Net Solution.sln b/WireMock.Net Solution.sln
index c6330330..746257a3 100644
--- a/WireMock.Net Solution.sln
+++ b/WireMock.Net Solution.sln
@@ -144,6 +144,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.xUnit.v3", "sr
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.NUnit", "src\WireMock.Net.NUnit\WireMock.Net.NUnit.csproj", "{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.OpenTelemetry", "src\WireMock.Net.OpenTelemetry\WireMock.Net.OpenTelemetry.csproj", "{C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.OpenTelemetryDemo", "examples\WireMock.Net.OpenTelemetryDemo\WireMock.Net.OpenTelemetryDemo.csproj", "{9957038D-F9C3-CA5D-E8AE-BE188E512635}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Console.NET8.WithCertificate", "examples\WireMock.Net.Console.NET8.WithCertificate\WireMock.Net.Console.NET8.WithCertificate.csproj", "{2D86546D-8A24-0A55-C962-2071BD299E05}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.WebApplication.IIS", "examples\WireMock.Net.WebApplication.IIS\WireMock.Net.WebApplication.IIS.csproj", "{5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}"
@@ -151,217 +155,661 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D3804228-91F4-4502-9595-39584E5A01AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D3804228-91F4-4502-9595-39584E5A01AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A01AD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A01AD}.Debug|x64.Build.0 = Debug|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A01AD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A01AD}.Debug|x86.Build.0 = Debug|Any CPU
{D3804228-91F4-4502-9595-39584E5A01AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D3804228-91F4-4502-9595-39584E5A01AD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A01AD}.Release|x64.ActiveCfg = Release|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A01AD}.Release|x64.Build.0 = Release|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A01AD}.Release|x86.ActiveCfg = Release|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A01AD}.Release|x86.Build.0 = Release|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A94}.Debug|x86.Build.0 = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|x64.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|x86.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A94}.Release|x86.Build.0 = Release|Any CPU
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Debug|x86.Build.0 = Debug|Any CPU
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|x64.Build.0 = Release|Any CPU
+ {B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|x86.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-43D6-8B9A-579DED3D9A96}.Release|x86.Build.0 = Release|Any CPU
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Debug|x86.Build.0 = Debug|Any CPU
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|x64.Build.0 = Release|Any CPU
+ {B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|x86.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-43D5-8B9A-579DED3D9A95}.Release|x86.Build.0 = Release|Any CPU
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|x64.Build.0 = Debug|Any CPU
+ {31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Debug|x86.Build.0 = Debug|Any CPU
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|x64.ActiveCfg = Release|Any CPU
+ {31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|x64.Build.0 = Release|Any CPU
+ {31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|x86.ActiveCfg = Release|Any CPU
+ {31DC2EF8-C3FE-467D-84BE-FB5D956E612E}.Release|x86.Build.0 = Release|Any CPU
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|x64.Build.0 = Debug|Any CPU
+ {74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Debug|x86.Build.0 = Debug|Any CPU
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|x64.ActiveCfg = Release|Any CPU
+ {74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|x64.Build.0 = Release|Any CPU
+ {74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|x86.ActiveCfg = Release|Any CPU
+ {74D91AD0-D96D-4FD2-AEC5-CC49D38346C0}.Release|x86.Build.0 = Release|Any CPU
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|x64.Build.0 = Debug|Any CPU
+ {7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7F0B2446-0363-4720-AF46-F47F83B557DC}.Debug|x86.Build.0 = Debug|Any CPU
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|x64.ActiveCfg = Release|Any CPU
+ {7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|x64.Build.0 = Release|Any CPU
+ {7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|x86.ActiveCfg = Release|Any CPU
+ {7F0B2446-0363-4720-AF46-F47F83B557DC}.Release|x86.Build.0 = Release|Any CPU
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|x64.Build.0 = Debug|Any CPU
+ {A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A9D039B9-7509-4CF1-9EFD-87EB82998575}.Debug|x86.Build.0 = Debug|Any CPU
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|x64.ActiveCfg = Release|Any CPU
+ {A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|x64.Build.0 = Release|Any CPU
+ {A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|x86.ActiveCfg = Release|Any CPU
+ {A9D039B9-7509-4CF1-9EFD-87EB82998575}.Release|x86.Build.0 = Release|Any CPU
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|x64.Build.0 = Debug|Any CPU
+ {5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Debug|x86.Build.0 = Debug|Any CPU
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|x64.ActiveCfg = Release|Any CPU
+ {5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|x64.Build.0 = Release|Any CPU
+ {5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|x86.ActiveCfg = Release|Any CPU
+ {5C09FB93-1535-4F92-AF26-21E8A061EE4A}.Release|x86.Build.0 = Release|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A95}.Debug|x86.Build.0 = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|x64.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|x86.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A95}.Release|x86.Build.0 = Release|Any CPU
{40BF24B5-12E6-4610-9489-138798632E28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{40BF24B5-12E6-4610-9489-138798632E28}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Debug|x64.Build.0 = Debug|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Debug|x86.Build.0 = Debug|Any CPU
{40BF24B5-12E6-4610-9489-138798632E28}.Release|Any CPU.ActiveCfg = Release|Any CPU
{40BF24B5-12E6-4610-9489-138798632E28}.Release|Any CPU.Build.0 = Release|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Release|x64.ActiveCfg = Release|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Release|x64.Build.0 = Release|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Release|x86.ActiveCfg = Release|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Release|x86.Build.0 = Release|Any CPU
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A44}.Debug|x86.Build.0 = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|x64.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|x86.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A44}.Release|x86.Build.0 = Release|Any CPU
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|x64.Build.0 = Debug|Any CPU
+ {08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Debug|x86.Build.0 = Debug|Any CPU
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|x64.ActiveCfg = Release|Any CPU
+ {08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|x64.Build.0 = Release|Any CPU
+ {08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|x86.ActiveCfg = Release|Any CPU
+ {08B29DB1-FEFE-408A-AD0A-6BA6DDC8D70F}.Release|x86.Build.0 = Release|Any CPU
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|x64.Build.0 = Debug|Any CPU
+ {3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Debug|x86.Build.0 = Debug|Any CPU
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|x64.ActiveCfg = Release|Any CPU
+ {3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|x64.Build.0 = Release|Any CPU
+ {3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|x86.ActiveCfg = Release|Any CPU
+ {3BA5109E-5F30-4CC2-B699-02EC82560AA6}.Release|x86.Build.0 = Release|Any CPU
{670C7562-C154-442E-A249-7D26849BCD13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{670C7562-C154-442E-A249-7D26849BCD13}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {670C7562-C154-442E-A249-7D26849BCD13}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {670C7562-C154-442E-A249-7D26849BCD13}.Debug|x64.Build.0 = Debug|Any CPU
+ {670C7562-C154-442E-A249-7D26849BCD13}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {670C7562-C154-442E-A249-7D26849BCD13}.Debug|x86.Build.0 = Debug|Any CPU
{670C7562-C154-442E-A249-7D26849BCD13}.Release|Any CPU.ActiveCfg = Release|Any CPU
{670C7562-C154-442E-A249-7D26849BCD13}.Release|Any CPU.Build.0 = Release|Any CPU
+ {670C7562-C154-442E-A249-7D26849BCD13}.Release|x64.ActiveCfg = Release|Any CPU
+ {670C7562-C154-442E-A249-7D26849BCD13}.Release|x64.Build.0 = Release|Any CPU
+ {670C7562-C154-442E-A249-7D26849BCD13}.Release|x86.ActiveCfg = Release|Any CPU
+ {670C7562-C154-442E-A249-7D26849BCD13}.Release|x86.Build.0 = Release|Any CPU
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|x64.Build.0 = Debug|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Debug|x86.Build.0 = Debug|Any CPU
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|x64.ActiveCfg = Release|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|x64.Build.0 = Release|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|x86.ActiveCfg = Release|Any CPU
+ {0DE0954F-8C00-4E8D-B94A-4361FC1CBE44}.Release|x86.Build.0 = Release|Any CPU
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|x64.Build.0 = Debug|Any CPU
+ {BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Debug|x86.Build.0 = Debug|Any CPU
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|x64.ActiveCfg = Release|Any CPU
+ {BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|x64.Build.0 = Release|Any CPU
+ {BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|x86.ActiveCfg = Release|Any CPU
+ {BAA9EC2A-874B-45CE-8E51-A73622DC7F3D}.Release|x86.Build.0 = Release|Any CPU
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|x64.Build.0 = Debug|Any CPU
+ {12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Debug|x86.Build.0 = Debug|Any CPU
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|x64.ActiveCfg = Release|Any CPU
+ {12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|x64.Build.0 = Release|Any CPU
+ {12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|x86.ActiveCfg = Release|Any CPU
+ {12B016A5-9D8B-4EFE-96C2-CA51BE43367D}.Release|x86.Build.0 = Release|Any CPU
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|x64.Build.0 = Debug|Any CPU
+ {56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {56A38798-C48B-4A4A-B805-071E05C02CE1}.Debug|x86.Build.0 = Debug|Any CPU
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|x64.ActiveCfg = Release|Any CPU
+ {56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|x64.Build.0 = Release|Any CPU
+ {56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|x86.ActiveCfg = Release|Any CPU
+ {56A38798-C48B-4A4A-B805-071E05C02CE1}.Release|x86.Build.0 = Release|Any CPU
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|x64.Build.0 = Debug|Any CPU
+ {07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Debug|x86.Build.0 = Debug|Any CPU
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|x64.ActiveCfg = Release|Any CPU
+ {07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|x64.Build.0 = Release|Any CPU
+ {07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|x86.ActiveCfg = Release|Any CPU
+ {07C30227-ADEC-4BDE-8CDC-849D85A690BB}.Release|x86.Build.0 = Release|Any CPU
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|x64.Build.0 = Debug|Any CPU
+ {1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Debug|x86.Build.0 = Debug|Any CPU
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|x64.ActiveCfg = Release|Any CPU
+ {1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|x64.Build.0 = Release|Any CPU
+ {1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|x86.ActiveCfg = Release|Any CPU
+ {1EA72C0F-92E9-486B-8FFE-53F992BFC4AA}.Release|x86.Build.0 = Release|Any CPU
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|x64.Build.0 = Debug|Any CPU
+ {7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7FC0B409-2682-40EE-B3B9-3930D6769D01}.Debug|x86.Build.0 = Debug|Any CPU
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|x64.ActiveCfg = Release|Any CPU
+ {7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|x64.Build.0 = Release|Any CPU
+ {7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|x86.ActiveCfg = Release|Any CPU
+ {7FC0B409-2682-40EE-B3B9-3930D6769D01}.Release|x86.Build.0 = Release|Any CPU
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|x64.Build.0 = Debug|Any CPU
+ {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Debug|x86.Build.0 = Debug|Any CPU
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|x64.ActiveCfg = Release|Any CPU
+ {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|x64.Build.0 = Release|Any CPU
+ {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|x86.ActiveCfg = Release|Any CPU
+ {B1580A38-84E7-44BE-8FE7-3EE5031D74A1}.Release|x86.Build.0 = Release|Any CPU
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|x64.Build.0 = Debug|Any CPU
+ {CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Debug|x86.Build.0 = Debug|Any CPU
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|x64.ActiveCfg = Release|Any CPU
+ {CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|x64.Build.0 = Release|Any CPU
+ {CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|x86.ActiveCfg = Release|Any CPU
+ {CAB42D88-B4E4-4887-B684-9F3E09D085A1}.Release|x86.Build.0 = Release|Any CPU
{42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|x64.Build.0 = Debug|Any CPU
+ {42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {42113E6B-DC43-4E80-9967-1E4233568E87}.Debug|x86.Build.0 = Debug|Any CPU
{42113E6B-DC43-4E80-9967-1E4233568E87}.Release|Any CPU.ActiveCfg = Release|Any CPU
{42113E6B-DC43-4E80-9967-1E4233568E87}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42113E6B-DC43-4E80-9967-1E4233568E87}.Release|x64.ActiveCfg = Release|Any CPU
+ {42113E6B-DC43-4E80-9967-1E4233568E87}.Release|x64.Build.0 = Release|Any CPU
+ {42113E6B-DC43-4E80-9967-1E4233568E87}.Release|x86.ActiveCfg = Release|Any CPU
+ {42113E6B-DC43-4E80-9967-1E4233568E87}.Release|x86.Build.0 = Release|Any CPU
{84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|x64.Build.0 = Debug|Any CPU
+ {84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {84624E1F-DF07-4315-89B0-51776BE99E13}.Debug|x86.Build.0 = Debug|Any CPU
{84624E1F-DF07-4315-89B0-51776BE99E13}.Release|Any CPU.ActiveCfg = Release|Any CPU
{84624E1F-DF07-4315-89B0-51776BE99E13}.Release|Any CPU.Build.0 = Release|Any CPU
+ {84624E1F-DF07-4315-89B0-51776BE99E13}.Release|x64.ActiveCfg = Release|Any CPU
+ {84624E1F-DF07-4315-89B0-51776BE99E13}.Release|x64.Build.0 = Release|Any CPU
+ {84624E1F-DF07-4315-89B0-51776BE99E13}.Release|x86.ActiveCfg = Release|Any CPU
+ {84624E1F-DF07-4315-89B0-51776BE99E13}.Release|x86.Build.0 = Release|Any CPU
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|x64.Build.0 = Debug|Any CPU
+ {A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Debug|x86.Build.0 = Debug|Any CPU
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|x64.ActiveCfg = Release|Any CPU
+ {A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|x64.Build.0 = Release|Any CPU
+ {A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|x86.ActiveCfg = Release|Any CPU
+ {A34F1575-7C33-4548-8CEF-8D8D8B84153C}.Release|x86.Build.0 = Release|Any CPU
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|x64.Build.0 = Debug|Any CPU
+ {7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Debug|x86.Build.0 = Debug|Any CPU
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|x64.ActiveCfg = Release|Any CPU
+ {7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|x64.Build.0 = Release|Any CPU
+ {7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|x86.ActiveCfg = Release|Any CPU
+ {7373B7DC-47ED-45A5-969D-D7DDBA529B53}.Release|x86.Build.0 = Release|Any CPU
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|x64.Build.0 = Debug|Any CPU
+ {CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Debug|x86.Build.0 = Debug|Any CPU
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|x64.ActiveCfg = Release|Any CPU
+ {CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|x64.Build.0 = Release|Any CPU
+ {CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|x86.ActiveCfg = Release|Any CPU
+ {CE602F57-FEF8-4559-A9E0-6200BE1BF398}.Release|x86.Build.0 = Release|Any CPU
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|x64.Build.0 = Debug|Any CPU
+ {F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Debug|x86.Build.0 = Debug|Any CPU
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|x64.ActiveCfg = Release|Any CPU
+ {F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|x64.Build.0 = Release|Any CPU
+ {F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|x86.ActiveCfg = Release|Any CPU
+ {F1B5999D-D22E-48A6-AB86-18A7876BD32E}.Release|x86.Build.0 = Release|Any CPU
{C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|x64.Build.0 = Debug|Any CPU
+ {C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C9210DA3-F390-4598-8512-349A473FE9C9}.Debug|x86.Build.0 = Debug|Any CPU
{C9210DA3-F390-4598-8512-349A473FE9C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C9210DA3-F390-4598-8512-349A473FE9C9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C9210DA3-F390-4598-8512-349A473FE9C9}.Release|x64.ActiveCfg = Release|Any CPU
+ {C9210DA3-F390-4598-8512-349A473FE9C9}.Release|x64.Build.0 = Release|Any CPU
+ {C9210DA3-F390-4598-8512-349A473FE9C9}.Release|x86.ActiveCfg = Release|Any CPU
+ {C9210DA3-F390-4598-8512-349A473FE9C9}.Release|x86.Build.0 = Release|Any CPU
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|x64.Build.0 = Debug|Any CPU
+ {91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {91024A93-848F-4A02-AF53-5EBE5834E23C}.Debug|x86.Build.0 = Debug|Any CPU
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|x64.ActiveCfg = Release|Any CPU
+ {91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|x64.Build.0 = Release|Any CPU
+ {91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|x86.ActiveCfg = Release|Any CPU
+ {91024A93-848F-4A02-AF53-5EBE5834E23C}.Release|x86.Build.0 = Release|Any CPU
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|x64.Build.0 = Debug|Any CPU
+ {4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Debug|x86.Build.0 = Debug|Any CPU
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|x64.ActiveCfg = Release|Any CPU
+ {4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|x64.Build.0 = Release|Any CPU
+ {4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|x86.ActiveCfg = Release|Any CPU
+ {4CD237F7-B616-46B8-872F-E49B4BBB3EAE}.Release|x86.Build.0 = Release|Any CPU
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|x64.Build.0 = Debug|Any CPU
+ {E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Debug|x86.Build.0 = Debug|Any CPU
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|x64.ActiveCfg = Release|Any CPU
+ {E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|x64.Build.0 = Release|Any CPU
+ {E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|x86.ActiveCfg = Release|Any CPU
+ {E72ADFAB-4B42-439E-B1EE-C06E504B35D2}.Release|x86.Build.0 = Release|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A13}.Debug|x86.Build.0 = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|x64.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|x86.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-579DED3D9A13}.Release|x86.Build.0 = Release|Any CPU
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|x64.Build.0 = Debug|Any CPU
+ {6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Debug|x86.Build.0 = Debug|Any CPU
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|x64.ActiveCfg = Release|Any CPU
+ {6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|x64.Build.0 = Release|Any CPU
+ {6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|x86.ActiveCfg = Release|Any CPU
+ {6B30AA9F-DA04-4EB5-B03C-45A8EF272ECE}.Release|x86.Build.0 = Release|Any CPU
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|x64.Build.0 = Debug|Any CPU
+ {A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Debug|x86.Build.0 = Debug|Any CPU
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|x64.ActiveCfg = Release|Any CPU
+ {A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|x64.Build.0 = Release|Any CPU
+ {A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|x86.ActiveCfg = Release|Any CPU
+ {A5FEF4F7-7DA2-4962-89A8-16BA942886E5}.Release|x86.Build.0 = Release|Any CPU
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|x64.Build.0 = Debug|Any CPU
+ {7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7753670F-7C7F-44BF-8BC7-08325588E60C}.Debug|x86.Build.0 = Debug|Any CPU
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|x64.ActiveCfg = Release|Any CPU
+ {7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|x64.Build.0 = Release|Any CPU
+ {7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|x86.ActiveCfg = Release|Any CPU
+ {7753670F-7C7F-44BF-8BC7-08325588E60C}.Release|x86.Build.0 = Release|Any CPU
{E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|x64.Build.0 = Debug|Any CPU
+ {E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E5B03EEF-822C-4295-952B-4479AD30082B}.Debug|x86.Build.0 = Debug|Any CPU
{E5B03EEF-822C-4295-952B-4479AD30082B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5B03EEF-822C-4295-952B-4479AD30082B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E5B03EEF-822C-4295-952B-4479AD30082B}.Release|x64.ActiveCfg = Release|Any CPU
+ {E5B03EEF-822C-4295-952B-4479AD30082B}.Release|x64.Build.0 = Release|Any CPU
+ {E5B03EEF-822C-4295-952B-4479AD30082B}.Release|x86.ActiveCfg = Release|Any CPU
+ {E5B03EEF-822C-4295-952B-4479AD30082B}.Release|x86.Build.0 = Release|Any CPU
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|x64.Build.0 = Debug|Any CPU
+ {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Debug|x86.Build.0 = Debug|Any CPU
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|x64.ActiveCfg = Release|Any CPU
+ {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|x64.Build.0 = Release|Any CPU
+ {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|x86.ActiveCfg = Release|Any CPU
+ {F8B4A93E-46EF-4237-88FE-15FDAB7635D4}.Release|x86.Build.0 = Release|Any CPU
{D3804228-91F4-4502-9595-39584E5A0177}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D3804228-91F4-4502-9595-39584E5A0177}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A0177}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A0177}.Debug|x64.Build.0 = Debug|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A0177}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A0177}.Debug|x86.Build.0 = Debug|Any CPU
{D3804228-91F4-4502-9595-39584E5A0177}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D3804228-91F4-4502-9595-39584E5A0177}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A0177}.Release|x64.ActiveCfg = Release|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A0177}.Release|x64.Build.0 = Release|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A0177}.Release|x86.ActiveCfg = Release|Any CPU
+ {D3804228-91F4-4502-9595-39584E5A0177}.Release|x86.Build.0 = Release|Any CPU
{BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|x64.Build.0 = Debug|Any CPU
+ {BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BFEF8990-65B3-4274-310F-7355F0B84035}.Debug|x86.Build.0 = Debug|Any CPU
{BFEF8990-65B3-4274-310F-7355F0B84035}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BFEF8990-65B3-4274-310F-7355F0B84035}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BFEF8990-65B3-4274-310F-7355F0B84035}.Release|x64.ActiveCfg = Release|Any CPU
+ {BFEF8990-65B3-4274-310F-7355F0B84035}.Release|x64.Build.0 = Release|Any CPU
+ {BFEF8990-65B3-4274-310F-7355F0B84035}.Release|x86.ActiveCfg = Release|Any CPU
+ {BFEF8990-65B3-4274-310F-7355F0B84035}.Release|x86.Build.0 = Release|Any CPU
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|x64.Build.0 = Debug|Any CPU
+ {1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Debug|x86.Build.0 = Debug|Any CPU
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|x64.ActiveCfg = Release|Any CPU
+ {1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|x64.Build.0 = Release|Any CPU
+ {1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|x86.ActiveCfg = Release|Any CPU
+ {1F80A6E6-D146-4E40-9EA8-49DB8494239F}.Release|x86.Build.0 = Release|Any CPU
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|x64.Build.0 = Debug|Any CPU
+ {BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Debug|x86.Build.0 = Debug|Any CPU
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|x64.ActiveCfg = Release|Any CPU
+ {BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|x64.Build.0 = Release|Any CPU
+ {BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|x86.ActiveCfg = Release|Any CPU
+ {BBA332C6-28A9-42E7-9C4D-A0816E52A198}.Release|x86.Build.0 = Release|Any CPU
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Debug|x86.Build.0 = Debug|Any CPU
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|x64.Build.0 = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|x86.ActiveCfg = Release|Any CPU
+ {B6269AAC-170A-4346-8B9A-444DED3D9A45}.Release|x86.Build.0 = Release|Any CPU
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|x64.Build.0 = Debug|Any CPU
+ {3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Debug|x86.Build.0 = Debug|Any CPU
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|x64.ActiveCfg = Release|Any CPU
+ {3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|x64.Build.0 = Release|Any CPU
+ {3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|x86.ActiveCfg = Release|Any CPU
+ {3FCBCA9C-9DB0-4A96-B47E-30470764CC9C}.Release|x86.Build.0 = Release|Any CPU
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|x64.Build.0 = Debug|Any CPU
+ {1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1E874C8F-08A2-493B-8421-619F9A6E9E77}.Debug|x86.Build.0 = Debug|Any CPU
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|x64.ActiveCfg = Release|Any CPU
+ {1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|x64.Build.0 = Release|Any CPU
+ {1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|x86.ActiveCfg = Release|Any CPU
+ {1E874C8F-08A2-493B-8421-619F9A6E9E77}.Release|x86.Build.0 = Release|Any CPU
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|x64.Build.0 = Debug|Any CPU
+ {B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B47413AA-55D3-49A7-896A-17ADBFF72407}.Debug|x86.Build.0 = Debug|Any CPU
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|Any CPU.Build.0 = Release|Any CPU
- {2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2D86546D-8A24-0A55-C962-2071BD299E05}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2D86546D-8A24-0A55-C962-2071BD299E05}.Release|Any CPU.Build.0 = Release|Any CPU
- {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|x64.ActiveCfg = Release|Any CPU
+ {B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|x64.Build.0 = Release|Any CPU
+ {B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|x86.ActiveCfg = Release|Any CPU
+ {B47413AA-55D3-49A7-896A-17ADBFF72407}.Release|x86.Build.0 = Release|Any CPU
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|x64.Build.0 = Debug|Any CPU
+ {4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Debug|x86.Build.0 = Debug|Any CPU
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|x64.ActiveCfg = Release|Any CPU
+ {4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|x64.Build.0 = Release|Any CPU
+ {4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|x86.ActiveCfg = Release|Any CPU
+ {4F46BD02-BEBC-4B2D-B857-4169AD1FB067}.Release|x86.Build.0 = Release|Any CPU
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|x64.Build.0 = Debug|Any CPU
+ {2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Debug|x86.Build.0 = Debug|Any CPU
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|x64.ActiveCfg = Release|Any CPU
+ {2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|x64.Build.0 = Release|Any CPU
+ {2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|x86.ActiveCfg = Release|Any CPU
+ {2DBBD70D-8051-441F-92BB-FF9B8B4B4982}.Release|x86.Build.0 = Release|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|x64.Build.0 = Debug|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Debug|x86.Build.0 = Debug|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|x64.ActiveCfg = Release|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|x64.Build.0 = Release|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|x86.ActiveCfg = Release|Any CPU
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}.Release|x86.Build.0 = Release|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|x64.Build.0 = Debug|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Debug|x86.Build.0 = Debug|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|x64.ActiveCfg = Release|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|x64.Build.0 = Release|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|x86.ActiveCfg = Release|Any CPU
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635}.Release|x86.Build.0 = Release|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|x64.Build.0 = Debug|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Debug|x86.Build.0 = Debug|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Release|x64.ActiveCfg = Release|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Release|x64.Build.0 = Release|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Release|x86.ActiveCfg = Release|Any CPU
+ {2D86546D-8A24-0A55-C962-2071BD299E05}.Release|x86.Build.0 = Release|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|x64.Build.0 = Debug|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Debug|x86.Build.0 = Debug|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|x64.ActiveCfg = Release|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|x64.Build.0 = Release|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|x86.ActiveCfg = Release|Any CPU
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -417,10 +865,12 @@ Global
{3FCBCA9C-9DB0-4A96-B47E-30470764CC9C} = {0BB8B634-407A-4610-A91F-11586990767A}
{1E874C8F-08A2-493B-8421-619F9A6E9E77} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
{B47413AA-55D3-49A7-896A-17ADBFF72407} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
- {2D86546D-8A24-0A55-C962-2071BD299E05} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
- {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
{4F46BD02-BEBC-4B2D-B857-4169AD1FB067} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
{2DBBD70D-8051-441F-92BB-FF9B8B4B4982} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
+ {9957038D-F9C3-CA5D-E8AE-BE188E512635} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
+ {2D86546D-8A24-0A55-C962-2071BD299E05} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
+ {5E6E9FA7-9135-7B82-2CCD-8CA87AC8043C} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458}
diff --git a/examples-Aspire/AspireApp1.AppHost/AspireApp1.AppHost.csproj b/examples-Aspire/AspireApp1.AppHost/AspireApp1.AppHost.csproj
index cf43ca01..a04440d9 100644
--- a/examples-Aspire/AspireApp1.AppHost/AspireApp1.AppHost.csproj
+++ b/examples-Aspire/AspireApp1.AppHost/AspireApp1.AppHost.csproj
@@ -1,6 +1,6 @@
-
+
Exe
@@ -18,7 +18,7 @@
-
+
diff --git a/examples-Aspire/AspireApp1.AppHost/Program.cs b/examples-Aspire/AspireApp1.AppHost/Program.cs
index 3ed78657..7a851900 100644
--- a/examples-Aspire/AspireApp1.AppHost/Program.cs
+++ b/examples-Aspire/AspireApp1.AppHost/Program.cs
@@ -24,7 +24,8 @@ IResourceBuilder apiService2 = builder
.AsHttp2Service()
.WithMappingsPath(mappingsPath)
.WithWatchStaticMappings()
- .WithApiMappingBuilder(WeatherForecastApiMock.BuildAsync);
+ .WithApiMappingBuilder(WeatherForecastApiMock.BuildAsync)
+ .WithOpenTelemetry(); // Enable OpenTelemetry tracing for Aspire dashboard
//var apiServiceUsedForDocs = builder
// .AddWireMock("apiservice1", WireMockServerArguments.DefaultPort)
diff --git a/examples-Aspire/AspireApp1.AppHostOriginal/AspireApp1.AppHostOriginal.csproj b/examples-Aspire/AspireApp1.AppHostOriginal/AspireApp1.AppHostOriginal.csproj
index f556db85..ddfe855d 100644
--- a/examples-Aspire/AspireApp1.AppHostOriginal/AspireApp1.AppHostOriginal.csproj
+++ b/examples-Aspire/AspireApp1.AppHostOriginal/AspireApp1.AppHostOriginal.csproj
@@ -1,6 +1,6 @@
-
+
Exe
@@ -15,7 +15,7 @@
-
+
diff --git a/examples-Aspire/AspireApp1.AppHostOriginal/Program.cs b/examples-Aspire/AspireApp1.AppHostOriginal/Program.cs
index db90f730..d8288c47 100644
--- a/examples-Aspire/AspireApp1.AppHostOriginal/Program.cs
+++ b/examples-Aspire/AspireApp1.AppHostOriginal/Program.cs
@@ -6,4 +6,4 @@ builder.AddProject("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(apiService);
-builder.Build().Run();
\ No newline at end of file
+await builder.Build().RunAsync();
\ No newline at end of file
diff --git a/examples-Aspire/AspireApp1.Tests/AspireApp1.Tests.csproj b/examples-Aspire/AspireApp1.Tests/AspireApp1.Tests.csproj
index a4d0fb2c..94f73378 100644
--- a/examples-Aspire/AspireApp1.Tests/AspireApp1.Tests.csproj
+++ b/examples-Aspire/AspireApp1.Tests/AspireApp1.Tests.csproj
@@ -9,7 +9,7 @@
-
+
diff --git a/examples/WireMock.Net.OpenTelemetryDemo/Program.cs b/examples/WireMock.Net.OpenTelemetryDemo/Program.cs
new file mode 100644
index 00000000..e7664ba5
--- /dev/null
+++ b/examples/WireMock.Net.OpenTelemetryDemo/Program.cs
@@ -0,0 +1,142 @@
+// Copyright © WireMock.Net
+// OpenTelemetry Tracing Demo for WireMock.Net
+// This demo uses the Console Exporter to visualize traces in the terminal.
+
+using OpenTelemetry;
+using OpenTelemetry.Trace;
+using WireMock.OpenTelemetry;
+using WireMock.Server;
+using WireMock.Settings;
+using WireMock.RequestBuilders;
+using WireMock.ResponseBuilders;
+
+Console.WriteLine("=== WireMock.Net OpenTelemetry Tracing Demo ===\n");
+
+// WireMock.Net creates Activity objects using System.Diagnostics.Activity (built into .NET).
+// These activities are automatically created when ActivityTracingEnabled is set to true.
+//
+// To export these traces, you have two options:
+//
+// Option 1: Configure your own TracerProvider (shown below)
+// - Full control over exporters (Console, OTLP, Jaeger, etc.)
+// - Add additional instrumentation (HttpClient, database, etc.)
+// - Recommended for most applications
+//
+// Option 2: Use WireMock.Net.OpenTelemetry package
+// - Reference the WireMock.Net.OpenTelemetry NuGet package
+// - Use services.AddWireMockOpenTelemetry(openTelemetryOptions)
+// - Adds WireMock + ASP.NET Core instrumentation and OTLP exporter
+// - Good for quick setup with all-in-one configuration
+
+// Option 1: Custom TracerProvider with Console exporter for this demo
+using var tracerProvider = Sdk.CreateTracerProviderBuilder()
+ .AddWireMockInstrumentation(new OpenTelemetryOptions() { ExcludeAdminRequests = true })
+ .AddHttpClientInstrumentation() // HTTP client traces (for our test requests)
+ .AddConsoleExporter() // Export traces to console for demo purposes
+ .AddOtlpExporter() // Export to real OTLP collector (e.g. Jaeger, Tempo, etc.)
+ .Build();
+
+Console.WriteLine("Console Exporter configured to visualize:");
+Console.WriteLine(" - WireMock.Net traces (wiremock.* tags)");
+Console.WriteLine(" - ASP.NET Core server traces");
+Console.WriteLine(" - HTTP client traces\n");
+
+// Start WireMock server with OpenTelemetry enabled (ActivityTracingOptions != null enables tracing)
+var server = WireMockServer.Start(new WireMockServerSettings
+{
+ StartAdminInterface = true,
+ ActivityTracingOptions = new ActivityTracingOptions
+ {
+ ExcludeAdminRequests = true
+ }
+});
+
+Console.WriteLine($"WireMock server started at: {string.Join(", ", server.Urls)}\n");
+
+// Configure some mock mappings
+server
+ .Given(Request.Create()
+ .WithPath("/api/hello")
+ .UsingGet())
+ .RespondWith(Response.Create()
+ .WithStatusCode(200)
+ .WithBody("Hello from WireMock!"));
+
+server
+ .Given(Request.Create()
+ .WithPath("/api/user/*")
+ .UsingGet())
+ .RespondWith(Response.Create()
+ .WithStatusCode(200)
+ .WithHeader("Content-Type", "application/json")
+ .WithBody(@"{""name"": ""John Doe"", ""email"": ""john@example.com""}"));
+
+server
+ .Given(Request.Create()
+ .WithPath("/api/error")
+ .UsingGet())
+ .RespondWith(Response.Create()
+ .WithStatusCode(500)
+ .WithBody("Internal Server Error"));
+
+Console.WriteLine("Mock mappings configured:");
+Console.WriteLine(" GET /api/hello -> 200 OK");
+Console.WriteLine(" GET /api/user/* -> 200 OK (JSON)");
+Console.WriteLine(" GET /api/error -> 500 Error");
+Console.WriteLine();
+
+// Make some test requests to generate traces
+using var httpClient = server.CreateClient();
+
+Console.WriteLine("Making test requests to generate traces...\n");
+Console.WriteLine("─────────────────────────────────────────────────────────────────");
+
+// Request 1: Successful request
+Console.WriteLine("\n>>> Request 1: GET /api/hello");
+var response1 = await httpClient.GetAsync("/api/hello");
+Console.WriteLine($"<<< Response: {(int)response1.StatusCode} {response1.StatusCode}");
+Console.WriteLine($" Body: {await response1.Content.ReadAsStringAsync()}");
+
+await Task.Delay(500); // Small delay to let trace export complete
+
+// Request 2: Another successful request with path parameter
+Console.WriteLine("\n>>> Request 2: GET /api/user/123");
+var response2 = await httpClient.GetAsync("/api/user/123");
+Console.WriteLine($"<<< Response: {(int)response2.StatusCode} {response2.StatusCode}");
+Console.WriteLine($" Body: {await response2.Content.ReadAsStringAsync()}");
+
+await Task.Delay(500);
+
+// Request 3: Error response
+Console.WriteLine("\n>>> Request 3: GET /api/error");
+var response3 = await httpClient.GetAsync("/api/error");
+Console.WriteLine($"<<< Response: {(int)response3.StatusCode} {response3.StatusCode}");
+Console.WriteLine($" Body: {await response3.Content.ReadAsStringAsync()}");
+
+await Task.Delay(500);
+
+// Request 4: No matching mapping (404)
+Console.WriteLine("\n>>> Request 4: GET /api/notfound");
+var response4 = await httpClient.GetAsync("/api/notfound");
+Console.WriteLine($"<<< Response: {(int)response4.StatusCode} {response4.StatusCode}");
+
+await Task.Delay(500);
+
+// Request 5: Admin API request (should be excluded from tracing)
+Console.WriteLine("\n>>> Request 5: GET /__admin/health");
+var response5 = await httpClient.GetAsync("/__admin/health");
+Console.WriteLine($"<<< Admin Health Status: {response5.StatusCode}");
+
+Console.WriteLine("\n─────────────────────────────────────────────────────────────────");
+Console.WriteLine("\nTraces above show OpenTelemetry activities from WireMock.Net!");
+Console.WriteLine("Look for 'Activity.TraceId', 'Activity.SpanId', and custom tags like:");
+Console.WriteLine(" - http.request.method");
+Console.WriteLine(" - url.path");
+Console.WriteLine(" - http.response.status_code");
+Console.WriteLine(" - wiremock.mapping.matched");
+Console.WriteLine(" - wiremock.mapping.guid");
+Console.WriteLine();
+
+// Cleanup
+server.Stop();
+Console.WriteLine("WireMock server stopped. Demo complete!");
diff --git a/examples/WireMock.Net.OpenTelemetryDemo/WireMock.Net.OpenTelemetryDemo.csproj b/examples/WireMock.Net.OpenTelemetryDemo/WireMock.Net.OpenTelemetryDemo.csproj
new file mode 100644
index 00000000..5608d759
--- /dev/null
+++ b/examples/WireMock.Net.OpenTelemetryDemo/WireMock.Net.OpenTelemetryDemo.csproj
@@ -0,0 +1,21 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/WireMock.Net.Aspire/WireMock.Net.Aspire.csproj b/src/WireMock.Net.Aspire/WireMock.Net.Aspire.csproj
index 088098d4..379011c0 100644
--- a/src/WireMock.Net.Aspire/WireMock.Net.Aspire.csproj
+++ b/src/WireMock.Net.Aspire/WireMock.Net.Aspire.csproj
@@ -45,7 +45,7 @@
-
+
diff --git a/src/WireMock.Net.Aspire/WireMockServerArguments.cs b/src/WireMock.Net.Aspire/WireMockServerArguments.cs
index 3a28aefa..1ca0d200 100644
--- a/src/WireMock.Net.Aspire/WireMockServerArguments.cs
+++ b/src/WireMock.Net.Aspire/WireMockServerArguments.cs
@@ -79,6 +79,22 @@ public class WireMockServerArguments
///
public Dictionary ProtoDefinitions { get; set; } = [];
+ ///
+ /// Gets or sets a value indicating whether OpenTelemetry tracing is enabled.
+ /// When enabled, WireMock.Net will emit distributed traces for request processing.
+ /// Default value is false.
+ ///
+ public bool OpenTelemetryEnabled { get; set; }
+
+ ///
+ /// Gets or sets the OTLP exporter endpoint URL.
+ /// When set, traces will be exported to this endpoint using the OTLP protocol.
+ /// Example: "http://localhost:4317" for gRPC or "http://localhost:4318" for HTTP.
+ /// If not set, the OTLP exporter will use the OTEL_EXPORTER_OTLP_ENDPOINT environment variable,
+ /// or fall back to the default endpoint (http://localhost:4317 for gRPC).
+ ///
+ public string? OpenTelemetryOtlpExporterEndpoint { get; set; }
+
///
/// Add an additional Urls on which WireMock should listen.
///
@@ -138,6 +154,20 @@ public class WireMockServerArguments
Add(args, "--WatchStaticMappingsInSubdirectories", "true");
}
+ if (OpenTelemetryEnabled)
+ {
+ // Enable activity tracing (creates System.Diagnostics.Activity objects)
+ Add(args, "--ActivityTracingEnabled", "true");
+
+ // Enable OpenTelemetry exporter
+ Add(args, "--OpenTelemetryEnabled", "true");
+
+ if (!string.IsNullOrEmpty(OpenTelemetryOtlpExporterEndpoint))
+ {
+ Add(args, "--OpenTelemetryOtlpExporterEndpoint", OpenTelemetryOtlpExporterEndpoint);
+ }
+ }
+
if (AdditionalUrls.Count > 0)
{
Add(args, "--Urls", $"http://*:{HttpContainerPort} {string.Join(' ', AdditionalUrls)}");
diff --git a/src/WireMock.Net.Aspire/WireMockServerBuilderExtensions.cs b/src/WireMock.Net.Aspire/WireMockServerBuilderExtensions.cs
index 07c5dc79..70a1527c 100644
--- a/src/WireMock.Net.Aspire/WireMockServerBuilderExtensions.cs
+++ b/src/WireMock.Net.Aspire/WireMockServerBuilderExtensions.cs
@@ -287,6 +287,40 @@ public static class WireMockServerBuilderExtensions
return wiremock;
}
+ ///
+ /// Configures OpenTelemetry distributed tracing for the WireMock.Net server.
+ /// This enables automatic trace export to the Aspire dashboard.
+ ///
+ /// The .
+ /// A reference to the .
+ ///
+ /// When enabled, WireMock.Net will emit distributed traces for each request processed,
+ /// including information about:
+ ///
+ /// - HTTP method, URL, and status code
+ /// - Mapping match results and scores
+ /// - Request processing duration
+ ///
+ /// The traces will automatically appear in the Aspire dashboard.
+ ///
+ public static IResourceBuilder WithOpenTelemetry(this IResourceBuilder wiremock)
+ {
+ Guard.NotNull(wiremock);
+
+ // Enable OpenTelemetry in WireMock server arguments
+ wiremock.Resource.Arguments.OpenTelemetryEnabled = true;
+
+ // Use Aspire's standard WithOtlpExporter to configure OTEL environment variables for the container
+ // This sets OTEL_EXPORTER_OTLP_ENDPOINT which the OTLP exporter reads automatically
+ var containerBuilder = wiremock as IResourceBuilder;
+ if (containerBuilder != null)
+ {
+ containerBuilder.WithOtlpExporter();
+ }
+
+ return wiremock;
+ }
+
private static Task OnRunOpenInspectorCommandAsync(IResourceBuilder builder)
{
WireMockInspector.Inspect(builder.Resource.GetEndpoint().Url);
diff --git a/src/WireMock.Net.Minimal/Owin/ActivityTracing/WireMockActivitySource.cs b/src/WireMock.Net.Minimal/Owin/ActivityTracing/WireMockActivitySource.cs
new file mode 100644
index 00000000..d0fa88bd
--- /dev/null
+++ b/src/WireMock.Net.Minimal/Owin/ActivityTracing/WireMockActivitySource.cs
@@ -0,0 +1,199 @@
+// Copyright © WireMock.Net
+
+using System;
+using System.Diagnostics;
+using WireMock.Logging;
+using WireMock.Settings;
+
+namespace WireMock.Owin.ActivityTracing;
+
+///
+/// Provides an ActivitySource for WireMock.Net distributed tracing.
+///
+public static class WireMockActivitySource
+{
+ ///
+ /// The name of the ActivitySource used by WireMock.Net.
+ ///
+ internal const string SourceName = "WireMock.Net";
+
+ ///
+ /// The ActivitySource instance used for creating tracing activities.
+ ///
+ public static readonly ActivitySource Source = new(SourceName, GetVersion());
+
+ private static string GetVersion()
+ {
+ return typeof(WireMockActivitySource).Assembly.GetName().Version?.ToString() ?? "1.0.0";
+ }
+
+ ///
+ /// Starts a new activity for a WireMock request.
+ ///
+ /// The HTTP method of the request.
+ /// The path of the request.
+ /// The started activity, or null if tracing is not enabled.
+ internal static Activity? StartRequestActivity(string requestMethod, string requestPath)
+ {
+ if (!Source.HasListeners())
+ {
+ return null;
+ }
+
+ var activity = Source.StartActivity(
+ $"WireMock {requestMethod} {requestPath}",
+ ActivityKind.Server
+ );
+
+ return activity;
+ }
+
+ ///
+ /// Enriches an activity with request information.
+ ///
+ internal static void EnrichWithRequest(Activity? activity, IRequestMessage request, ActivityTracingOptions? options = null)
+ {
+ if (activity == null)
+ {
+ return;
+ }
+
+ activity.SetTag(WireMockSemanticConventions.HttpMethod, request.Method);
+ activity.SetTag(WireMockSemanticConventions.HttpUrl, request.Url);
+ activity.SetTag(WireMockSemanticConventions.HttpPath, request.Path);
+ activity.SetTag(WireMockSemanticConventions.HttpHost, request.Host);
+
+ if (request.ClientIP != null)
+ {
+ activity.SetTag(WireMockSemanticConventions.ClientAddress, request.ClientIP);
+ }
+
+ // Record request body if enabled
+ if (options?.RecordRequestBody == true && request.Body != null)
+ {
+ activity.SetTag(WireMockSemanticConventions.RequestBody, request.Body);
+ }
+ }
+
+ ///
+ /// Enriches an activity with response information.
+ ///
+ internal static void EnrichWithResponse(Activity? activity, IResponseMessage? response, ActivityTracingOptions? options = null)
+ {
+ if (activity == null || response == null)
+ {
+ return;
+ }
+
+ // StatusCode can be int, HttpStatusCode, or string
+ var statusCode = response.StatusCode;
+ int? statusCodeInt = statusCode switch
+ {
+ int i => i,
+ System.Net.HttpStatusCode hsc => (int)hsc,
+ string s when int.TryParse(s, out var parsed) => parsed,
+ _ => null
+ };
+
+ if (statusCodeInt.HasValue)
+ {
+ activity.SetTag(WireMockSemanticConventions.HttpStatusCode, statusCodeInt.Value);
+ activity.SetTag("otel.status_description", $"HTTP {statusCodeInt.Value}");
+
+ // Set status based on HTTP status code (using standard otel.status_code tag)
+ if (statusCodeInt.Value >= 400)
+ {
+ activity.SetTag("otel.status_code", "ERROR");
+ }
+ else
+ {
+ activity.SetTag("otel.status_code", "OK");
+ }
+ }
+
+ // Record response body if enabled
+ if (options?.RecordResponseBody == true && response.BodyData?.BodyAsString != null)
+ {
+ activity.SetTag(WireMockSemanticConventions.ResponseBody, response.BodyData.BodyAsString);
+ }
+ }
+
+ ///
+ /// Enriches an activity with mapping match information.
+ ///
+ internal static void EnrichWithMappingMatch(
+ Activity? activity,
+ Guid? mappingGuid,
+ string? mappingTitle,
+ bool isPerfectMatch,
+ double? matchScore)
+ {
+ if (activity == null)
+ {
+ return;
+ }
+
+ activity.SetTag(WireMockSemanticConventions.MappingMatched, isPerfectMatch);
+
+ if (mappingGuid.HasValue)
+ {
+ activity.SetTag(WireMockSemanticConventions.MappingGuid, mappingGuid.Value.ToString());
+ }
+
+ if (!string.IsNullOrEmpty(mappingTitle))
+ {
+ activity.SetTag(WireMockSemanticConventions.MappingTitle, mappingTitle);
+ }
+
+ if (matchScore.HasValue)
+ {
+ activity.SetTag(WireMockSemanticConventions.MatchScore, matchScore.Value);
+ }
+ }
+
+ ///
+ /// Enriches an activity with log entry information (includes response and mapping match info).
+ ///
+ internal static void EnrichWithLogEntry(Activity? activity, ILogEntry logEntry, ActivityTracingOptions? options = null)
+ {
+ if (activity == null)
+ {
+ return;
+ }
+
+ // Enrich with response
+ EnrichWithResponse(activity, logEntry.ResponseMessage, options);
+
+ // Enrich with mapping match (if enabled)
+ if (options?.RecordMatchDetails != false)
+ {
+ EnrichWithMappingMatch(
+ activity,
+ logEntry.MappingGuid,
+ logEntry.MappingTitle,
+ logEntry.RequestMatchResult?.IsPerfectMatch ?? false,
+ logEntry.RequestMatchResult?.TotalScore);
+ }
+
+ // Set request GUID
+ activity.SetTag(WireMockSemanticConventions.RequestGuid, logEntry.Guid.ToString());
+ }
+
+ ///
+ /// Records an exception on the activity.
+ ///
+ internal static void RecordException(Activity? activity, Exception exception)
+ {
+ if (activity == null)
+ {
+ return;
+ }
+
+ // Use standard OpenTelemetry exception semantic conventions
+ activity.SetTag("otel.status_code", "ERROR");
+ activity.SetTag("otel.status_description", exception.Message);
+ activity.SetTag("exception.type", exception.GetType().FullName);
+ activity.SetTag("exception.message", exception.Message);
+ activity.SetTag("exception.stacktrace", exception.ToString());
+ }
+}
\ No newline at end of file
diff --git a/src/WireMock.Net.Minimal/Owin/ActivityTracing/WireMockSemanticConventions.cs b/src/WireMock.Net.Minimal/Owin/ActivityTracing/WireMockSemanticConventions.cs
new file mode 100644
index 00000000..57de76e6
--- /dev/null
+++ b/src/WireMock.Net.Minimal/Owin/ActivityTracing/WireMockSemanticConventions.cs
@@ -0,0 +1,28 @@
+// Copyright © WireMock.Net
+
+namespace WireMock.Owin.ActivityTracing;
+
+///
+/// Semantic convention constants for WireMock.Net tracing attributes.
+///
+internal static class WireMockSemanticConventions
+{
+ // Standard HTTP semantic conventions (OpenTelemetry)
+ public const string HttpMethod = "http.request.method";
+ public const string HttpUrl = "url.full";
+ public const string HttpPath = "url.path";
+ public const string HttpHost = "server.address";
+ public const string HttpStatusCode = "http.response.status_code";
+ public const string ClientAddress = "client.address";
+
+ // WireMock-specific attributes
+ public const string MappingMatched = "wiremock.mapping.matched";
+ public const string MappingGuid = "wiremock.mapping.guid";
+ public const string MappingTitle = "wiremock.mapping.title";
+ public const string MatchScore = "wiremock.match.score";
+ public const string PartialMappingGuid = "wiremock.partial_mapping.guid";
+ public const string PartialMappingTitle = "wiremock.partial_mapping.title";
+ public const string RequestGuid = "wiremock.request.guid";
+ public const string RequestBody = "wiremock.request.body";
+ public const string ResponseBody = "wiremock.response.body";
+}
\ No newline at end of file
diff --git a/src/WireMock.Net.Minimal/Owin/IWireMockMiddlewareOptions.cs b/src/WireMock.Net.Minimal/Owin/IWireMockMiddlewareOptions.cs
index d35141f9..14ce7e50 100644
--- a/src/WireMock.Net.Minimal/Owin/IWireMockMiddlewareOptions.cs
+++ b/src/WireMock.Net.Minimal/Owin/IWireMockMiddlewareOptions.cs
@@ -8,17 +8,11 @@ using Microsoft.Extensions.DependencyInjection;
using WireMock.Handlers;
using WireMock.Logging;
using WireMock.Matchers;
+using WireMock.Settings;
using WireMock.Types;
using WireMock.Util;
using ClientCertificateMode = Microsoft.AspNetCore.Server.Kestrel.Https.ClientCertificateMode;
-//#if !USE_ASPNETCORE
-//using Owin;
-//#else
-//using IAppBuilder = Microsoft.AspNetCore.Builder.IApplicationBuilder;
-//using Microsoft.Extensions.DependencyInjection;
-//#endif
-
namespace WireMock.Owin;
internal interface IWireMockMiddlewareOptions
@@ -45,7 +39,6 @@ internal interface IWireMockMiddlewareOptions
Action? PostWireMockMiddlewareInit { get; set; }
-//#if USE_ASPNETCORE
Action? AdditionalServiceRegistration { get; set; }
CorsPolicyOptions? CorsPolicyOptions { get; set; }
@@ -53,7 +46,6 @@ internal interface IWireMockMiddlewareOptions
ClientCertificateMode ClientCertificateMode { get; set; }
bool AcceptAnyClientCertificate { get; set; }
-//#endif
IFileSystemHandler? FileSystemHandler { get; set; }
@@ -91,4 +83,10 @@ internal interface IWireMockMiddlewareOptions
QueryParameterMultipleValueSupport? QueryParameterMultipleValueSupport { get; set; }
public bool ProxyAll { get; set; }
+
+ ///
+ /// Gets or sets the activity tracing options.
+ /// When set, System.Diagnostics.Activity objects are created for request tracing.
+ ///
+ ActivityTracingOptions? ActivityTracingOptions { get; set; }
}
\ No newline at end of file
diff --git a/src/WireMock.Net.Minimal/Owin/WireMockMiddleware.cs b/src/WireMock.Net.Minimal/Owin/WireMockMiddleware.cs
index 1d2a7825..17eef6fa 100644
--- a/src/WireMock.Net.Minimal/Owin/WireMockMiddleware.cs
+++ b/src/WireMock.Net.Minimal/Owin/WireMockMiddleware.cs
@@ -17,19 +17,12 @@ using WireMock.ResponseBuilders;
using WireMock.Serialization;
using WireMock.Settings;
using WireMock.Util;
-//#if !USE_ASPNETCORE
-//using IContext = Microsoft.Owin.IOwinContext;
-//using OwinMiddleware = Microsoft.Owin.OwinMiddleware;
-//using Next = Microsoft.Owin.OwinMiddleware;
-//#else
-//using OwinMiddleware = System.Object;
-//using IContext = Microsoft.AspNetCore.Http.HttpContext;
-//using Next = Microsoft.AspNetCore.Http.RequestDelegate;
-//#endif
+using System.Diagnostics;
+using WireMock.Owin.ActivityTracing;
namespace WireMock.Owin;
-internal class WireMockMiddleware //: OwinMiddleware
+internal class WireMockMiddleware
{
private readonly object _lock = new();
private static readonly Task CompletedTask = Task.FromResult(false);
@@ -41,24 +34,6 @@ internal class WireMockMiddleware //: OwinMiddleware
private readonly LogEntryMapper _logEntryMapper;
private readonly IGuidUtils _guidUtils;
- //#if !USE_ASPNETCORE
- // public WireMockMiddleware(
- // Next next,
- // IWireMockMiddlewareOptions options,
- // IOwinRequestMapper requestMapper,
- // IOwinResponseMapper responseMapper,
- // IMappingMatcher mappingMatcher,
- // IGuidUtils guidUtils
- // ) : base(next)
- // {
- // _options = Guard.NotNull(options);
- // _requestMapper = Guard.NotNull(requestMapper);
- // _responseMapper = Guard.NotNull(responseMapper);
- // _mappingMatcher = Guard.NotNull(mappingMatcher);
- // _logEntryMapper = new LogEntryMapper(options);
- // _guidUtils = Guard.NotNull(guidUtils);
- // }
- //#else
public WireMockMiddleware(
RequestDelegate next,
IWireMockMiddlewareOptions options,
@@ -75,13 +50,8 @@ internal class WireMockMiddleware //: OwinMiddleware
_logEntryMapper = new LogEntryMapper(options);
_guidUtils = Guard.NotNull(guidUtils);
}
- //#endif
- //#if !USE_ASPNETCORE
- // public override Task Invoke(IContext ctx)
- //#else
public Task Invoke(HttpContext ctx)
- //#endif
{
if (_options.HandleRequestsSynchronously.GetValueOrDefault(false))
{
@@ -102,6 +72,19 @@ internal class WireMockMiddleware //: OwinMiddleware
IResponseMessage? response = null;
(MappingMatcherResult? Match, MappingMatcherResult? Partial) result = (null, null);
+ var tracingEnabled = _options.ActivityTracingOptions is not null;
+ var excludeAdmin = _options.ActivityTracingOptions?.ExcludeAdminRequests ?? true;
+ Activity? activity = null;
+
+ // Check if we should trace this request (optionally exclude admin requests)
+ var shouldTrace = tracingEnabled && !(excludeAdmin && request.Path.StartsWith("/__admin/"));
+
+ if (shouldTrace)
+ {
+ activity = WireMockActivitySource.StartRequestActivity(request.Method, request.Path);
+ WireMockActivitySource.EnrichWithRequest(activity, request, _options.ActivityTracingOptions);
+ }
+
try
{
foreach (var mapping in _options.Mappings.Values)
@@ -193,6 +176,8 @@ internal class WireMockMiddleware //: OwinMiddleware
catch (Exception ex)
{
_options.Logger.Error($"Providing a Response for Mapping '{result.Match?.Mapping.Guid}' failed. HttpStatusCode set to 500. Exception: {ex}");
+ WireMockActivitySource.RecordException(activity, ex);
+
response = ResponseMessageBuilder.Create(500, ex.Message);
}
finally
@@ -212,6 +197,9 @@ internal class WireMockMiddleware //: OwinMiddleware
PartialMatchResult = result.Partial?.RequestMatchResult
};
+ WireMockActivitySource.EnrichWithLogEntry(activity, log, _options.ActivityTracingOptions);
+ activity?.Dispose();
+
LogRequest(log, logRequest);
try
diff --git a/src/WireMock.Net.Minimal/Owin/WireMockMiddlewareOptions.cs b/src/WireMock.Net.Minimal/Owin/WireMockMiddlewareOptions.cs
index bfbc97d2..002b5a1b 100644
--- a/src/WireMock.Net.Minimal/Owin/WireMockMiddlewareOptions.cs
+++ b/src/WireMock.Net.Minimal/Owin/WireMockMiddlewareOptions.cs
@@ -2,24 +2,18 @@
using System;
using System.Collections.Concurrent;
+using System.Security.Cryptography.X509Certificates;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.DependencyInjection;
using WireMock.Handlers;
using WireMock.Logging;
using WireMock.Matchers;
+using WireMock.Owin.ActivityTracing;
+using WireMock.Settings;
using WireMock.Types;
using WireMock.Util;
-using System.Security.Cryptography.X509Certificates;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Server.Kestrel.Https;
-using Microsoft.Extensions.DependencyInjection;
using ClientCertificateMode = Microsoft.AspNetCore.Server.Kestrel.Https.ClientCertificateMode;
-//#if !USE_ASPNETCORE
-//using Owin;
-//#else
-//using IAppBuilder = Microsoft.AspNetCore.Builder.IApplicationBuilder;
-//using Microsoft.Extensions.DependencyInjection;
-//#endif
-
namespace WireMock.Owin;
internal class WireMockMiddlewareOptions : IWireMockMiddlewareOptions
@@ -110,4 +104,7 @@ internal class WireMockMiddlewareOptions : IWireMockMiddlewareOptions
///
public bool ProxyAll { get; set; }
+
+ ///
+ public ActivityTracingOptions? ActivityTracingOptions { get; set; }
}
\ No newline at end of file
diff --git a/src/WireMock.Net.Minimal/Owin/WireMockMiddlewareOptionsHelper.cs b/src/WireMock.Net.Minimal/Owin/WireMockMiddlewareOptionsHelper.cs
index a5dbd144..75f270d3 100644
--- a/src/WireMock.Net.Minimal/Owin/WireMockMiddlewareOptionsHelper.cs
+++ b/src/WireMock.Net.Minimal/Owin/WireMockMiddlewareOptionsHelper.cs
@@ -2,6 +2,7 @@
using System;
using Stef.Validation;
+using WireMock.Owin.ActivityTracing;
using WireMock.Settings;
namespace WireMock.Owin;
@@ -18,6 +19,7 @@ internal static class WireMockMiddlewareOptionsHelper
options ??= new WireMockMiddlewareOptions();
+ options.ActivityTracingOptions = settings.ActivityTracingOptions;
options.AllowBodyForAllHttpMethods = settings.AllowBodyForAllHttpMethods;
options.AllowOnlyDefinedHttpStatusCodeInResponse = settings.AllowOnlyDefinedHttpStatusCodeInResponse;
options.AllowPartialMapping = settings.AllowPartialMapping;
@@ -34,6 +36,13 @@ internal static class WireMockMiddlewareOptionsHelper
options.RequestLogExpirationDuration = settings.RequestLogExpirationDuration;
options.SaveUnmatchedRequests = settings.SaveUnmatchedRequests;
+#if USE_ASPNETCORE
+ options.AdditionalServiceRegistration = settings.AdditionalServiceRegistration;
+ options.CorsPolicyOptions = settings.CorsPolicyOptions;
+ options.ClientCertificateMode = settings.ClientCertificateMode;
+ options.AcceptAnyClientCertificate = settings.AcceptAnyClientCertificate;
+#endif
+
if (settings.CustomCertificateDefined)
{
options.X509StoreName = settings.CertificateSettings!.X509StoreName;
diff --git a/src/WireMock.Net.Minimal/Server/WireMockServer.cs b/src/WireMock.Net.Minimal/Server/WireMockServer.cs
index 6b1e6b42..2b36ef44 100644
--- a/src/WireMock.Net.Minimal/Server/WireMockServer.cs
+++ b/src/WireMock.Net.Minimal/Server/WireMockServer.cs
@@ -411,16 +411,12 @@ public partial class WireMockServer : IWireMockServer
_dateTimeUtils
);
- //#if USE_ASPNETCORE
_options.AdditionalServiceRegistration = _settings.AdditionalServiceRegistration;
_options.CorsPolicyOptions = _settings.CorsPolicyOptions;
_options.ClientCertificateMode = (Microsoft.AspNetCore.Server.Kestrel.Https.ClientCertificateMode)_settings.ClientCertificateMode;
_options.AcceptAnyClientCertificate = _settings.AcceptAnyClientCertificate;
_httpServer = new AspNetCoreSelfHost(_options, urlOptions);
- //#else
- // _httpServer = new OwinSelfHost(_options, urlOptions);
- //#endif
var startTask = _httpServer.StartAsync();
using (var ctsStartTimeout = new CancellationTokenSource(settings.StartTimeout))
diff --git a/src/WireMock.Net.Minimal/Settings/WireMockServerSettingsParser.cs b/src/WireMock.Net.Minimal/Settings/WireMockServerSettingsParser.cs
index 0dba1c21..6cd639a5 100644
--- a/src/WireMock.Net.Minimal/Settings/WireMockServerSettingsParser.cs
+++ b/src/WireMock.Net.Minimal/Settings/WireMockServerSettingsParser.cs
@@ -85,6 +85,7 @@ public static class WireMockServerSettingsParser
ParseProxyAndRecordSettings(settings, parser);
ParseCertificateSettings(settings, parser);
ParseHandlebarsSettings(settings, parser);
+ ParseActivityTracingSettings(settings, parser);
return true;
}
@@ -226,4 +227,19 @@ public static class WireMockServerSettingsParser
};
}
}
+
+ private static void ParseActivityTracingSettings(WireMockServerSettings settings, SimpleSettingsParser parser)
+ {
+ // Only create ActivityTracingOptions if tracing is enabled
+ if (parser.GetBoolValue("ActivityTracingEnabled") || parser.GetBoolValue("ActivityTracingOptions__Enabled"))
+ {
+ settings.ActivityTracingOptions = new ActivityTracingOptions
+ {
+ ExcludeAdminRequests = parser.GetBoolWithDefault("ActivityTracingExcludeAdminRequests", "ActivityTracingOptions__ExcludeAdminRequests", defaultValue: true),
+ RecordRequestBody = parser.GetBoolValue("ActivityTracingRecordRequestBody") || parser.GetBoolValue("ActivityTracingOptions__RecordRequestBody"),
+ RecordResponseBody = parser.GetBoolValue("ActivityTracingRecordResponseBody") || parser.GetBoolValue("ActivityTracingOptions__RecordResponseBody"),
+ RecordMatchDetails = parser.GetBoolWithDefault("ActivityTracingRecordMatchDetails", "ActivityTracingOptions__RecordMatchDetails", defaultValue: true)
+ };
+ }
+ }
}
\ No newline at end of file
diff --git a/src/WireMock.Net.OpenTelemetry/OpenTelemetryOptions.cs b/src/WireMock.Net.OpenTelemetry/OpenTelemetryOptions.cs
new file mode 100644
index 00000000..d2b2ee67
--- /dev/null
+++ b/src/WireMock.Net.OpenTelemetry/OpenTelemetryOptions.cs
@@ -0,0 +1,35 @@
+// Copyright © WireMock.Net
+
+using JetBrains.Annotations;
+
+namespace WireMock.OpenTelemetry;
+
+///
+/// OpenTelemetry exporter configuration options for WireMock.Net.
+/// These options control the export of traces to an OTLP endpoint.
+/// For controlling what data is recorded in traces, configure ActivityTracingOptions in WireMockServerSettings.
+///
+public class OpenTelemetryOptions
+{
+ ///
+ /// Gets or sets a value indicating whether to exclude admin interface requests from ASP.NET Core instrumentation.
+ /// Default is true.
+ ///
+ ///
+ /// This controls the ASP.NET Core HTTP server instrumentation filter.
+ /// To also exclude admin requests from WireMock's own activity tracing,
+ /// set ActivityTracingOptions.ExcludeAdminRequests in WireMockServerSettings.
+ ///
+ [PublicAPI]
+ public bool ExcludeAdminRequests { get; set; } = true;
+
+ ///
+ /// Gets or sets the OTLP exporter endpoint URL.
+ /// When set, traces will be exported to this endpoint using the OTLP protocol.
+ /// Example: "http://localhost:4317" for gRPC or "http://localhost:4318" for HTTP.
+ /// If not set, the OTLP exporter will use the OTEL_EXPORTER_OTLP_ENDPOINT environment variable,
+ /// or fall back to the default endpoint (http://localhost:4317 for gRPC).
+ ///
+ [PublicAPI]
+ public string? OtlpExporterEndpoint { get; set; }
+}
\ No newline at end of file
diff --git a/src/WireMock.Net.OpenTelemetry/OpenTelemetryOptionsParser.cs b/src/WireMock.Net.OpenTelemetry/OpenTelemetryOptionsParser.cs
new file mode 100644
index 00000000..8468923b
--- /dev/null
+++ b/src/WireMock.Net.OpenTelemetry/OpenTelemetryOptionsParser.cs
@@ -0,0 +1,44 @@
+// Copyright © WireMock.Net
+
+using System.Collections;
+using Stef.Validation;
+using WireMock.Settings;
+
+namespace WireMock.OpenTelemetry;
+
+///
+/// A static helper class to parse commandline arguments into OpenTelemetryOptions.
+///
+public static class OpenTelemetryOptionsParser
+{
+ private const string Prefix = "OpenTelemetry";
+
+ ///
+ /// Parse commandline arguments into OpenTelemetryOptions.
+ ///
+ /// The commandline arguments
+ /// The environment settings (optional)
+ /// The parsed options, or null if OpenTelemetry is not enabled
+ /// Always returns true.
+ public static bool TryParseArguments(string[] args, IDictionary? environment, out OpenTelemetryOptions? options)
+ {
+ Guard.HasNoNulls(args);
+
+ var parser = new SimpleSettingsParser();
+ parser.Parse(args, environment);
+
+ if (!parser.GetBoolValue($"{Prefix}Enabled"))
+ {
+ options = null;
+ return true;
+ }
+
+ options = new OpenTelemetryOptions
+ {
+ ExcludeAdminRequests = parser.GetBoolValue($"{Prefix}ExcludeAdminRequests", defaultValue: true),
+ OtlpExporterEndpoint = parser.GetStringValue($"{Prefix}OtlpExporterEndpoint")
+ };
+
+ return true;
+ }
+}
diff --git a/src/WireMock.Net.OpenTelemetry/README.md b/src/WireMock.Net.OpenTelemetry/README.md
new file mode 100644
index 00000000..7e972032
--- /dev/null
+++ b/src/WireMock.Net.OpenTelemetry/README.md
@@ -0,0 +1,160 @@
+# WireMock.Net.OpenTelemetry
+
+OpenTelemetry tracing support for WireMock.Net. This package provides instrumentation and OTLP (OpenTelemetry Protocol) exporting capabilities.
+
+## Overview
+
+WireMock.Net automatically creates `System.Diagnostics.Activity` objects for request tracing when `ActivityTracingOptions` is configured (not null). These activities use the built-in .NET distributed tracing infrastructure and are available without any additional dependencies.
+
+This package provides:
+- **WireMock.Net instrumentation** - Adds the WireMock.Net ActivitySource to the tracing pipeline
+- **ASP.NET Core instrumentation** - Standard HTTP server tracing with request filtering
+- **OTLP exporter** - Sends traces to an OpenTelemetry collector
+
+## Installation
+
+```bash
+dotnet add package WireMock.Net.OpenTelemetry
+```
+
+## Usage
+
+### Option 1: Using AdditionalServiceRegistration (Recommended)
+
+```csharp
+using WireMock.OpenTelemetry;
+using WireMock.Server;
+using WireMock.Settings;
+
+var openTelemetryOptions = new OpenTelemetryOptions
+{
+ ExcludeAdminRequests = true,
+ OtlpExporterEndpoint = "http://localhost:4317" // Your OTEL collector
+};
+
+var settings = new WireMockServerSettings
+{
+ // Setting ActivityTracingOptions (not null) enables activity creation in middleware
+ ActivityTracingOptions = new ActivityTracingOptions
+ {
+ ExcludeAdminRequests = true,
+ RecordRequestBody = false, // PII concern
+ RecordResponseBody = false, // PII concern
+ RecordMatchDetails = true
+ },
+ AdditionalServiceRegistration = services =>
+ {
+ services.AddWireMockOpenTelemetry(openTelemetryOptions);
+ }
+};
+
+var server = WireMockServer.Start(settings);
+```
+
+### Option 2: Custom TracerProvider Configuration
+
+For more control over the tracing configuration:
+
+```csharp
+using OpenTelemetry;
+using OpenTelemetry.Trace;
+using WireMock.OpenTelemetry;
+
+var openTelemetryOptions = new OpenTelemetryOptions();
+
+// Configure your own TracerProvider
+using var tracerProvider = Sdk.CreateTracerProviderBuilder()
+ .AddWireMockInstrumentation(openTelemetryOptions) // Adds WireMock.Net source
+ .AddOtlpExporter(options =>
+ {
+ options.Endpoint = new Uri("http://localhost:4317");
+ })
+ .Build();
+```
+
+## Extension Methods
+
+### `AddWireMockOpenTelemetry`
+
+Adds full OpenTelemetry tracing to the service collection with instrumentation and OTLP exporter:
+
+```csharp
+services.AddWireMockOpenTelemetry(openTelemetryOptions);
+```
+
+This configures:
+- The WireMock.Net ActivitySource
+- ASP.NET Core instrumentation
+- OTLP exporter (using the endpoint from `OpenTelemetryOptions.OtlpExporterEndpoint` or the `OTEL_EXPORTER_OTLP_ENDPOINT` environment variable)
+
+### `AddWireMockInstrumentation`
+
+Adds WireMock instrumentation to an existing TracerProviderBuilder:
+
+```csharp
+tracerProvider.AddWireMockInstrumentation(openTelemetryOptions);
+```
+
+## Configuration
+
+### OpenTelemetryOptions (Exporter configuration)
+
+| Property | Description | Default |
+|----------|-------------|---------|
+| `ExcludeAdminRequests` | Exclude `/__admin/*` from ASP.NET Core instrumentation | `true` |
+| `OtlpExporterEndpoint` | OTLP collector endpoint URL | Uses `OTEL_EXPORTER_OTLP_ENDPOINT` env var |
+
+### ActivityTracingOptions (Trace content configuration)
+
+Configured in `WireMockServerSettings.ActivityTracingOptions`:
+
+| Property | Description | Default |
+|----------|-------------|---------|
+| `ExcludeAdminRequests` | Exclude `/__admin/*` from WireMock activity creation | `true` |
+| `RecordRequestBody` | Include request body in trace attributes | `false` |
+| `RecordResponseBody` | Include response body in trace attributes | `false` |
+| `RecordMatchDetails` | Include mapping match details in trace attributes | `true` |
+
+## Trace Attributes
+
+WireMock.Net traces include these semantic conventions:
+
+**Standard HTTP attributes:**
+- `http.request.method`
+- `url.full`
+- `url.path`
+- `server.address`
+- `http.response.status_code`
+- `client.address`
+
+**WireMock-specific attributes:**
+- `wiremock.mapping.matched` - Whether a mapping was found
+- `wiremock.mapping.guid` - GUID of the matched mapping
+- `wiremock.mapping.title` - Title of the matched mapping
+- `wiremock.match.score` - Match score
+- `wiremock.request.guid` - GUID of the request
+
+## CLI Arguments
+
+When using WireMock.Net.StandAlone or Docker images, activity tracing and OpenTelemetry can be configured via command-line arguments:
+
+**Activity Tracing (what gets recorded):**
+```bash
+--ActivityTracingEnabled true
+--ActivityTracingExcludeAdminRequests true
+--ActivityTracingRecordRequestBody false
+--ActivityTracingRecordResponseBody false
+--ActivityTracingRecordMatchDetails true
+```
+
+**OpenTelemetry Export (where traces are sent):**
+```bash
+--OpenTelemetryEnabled true
+--OpenTelemetryOtlpExporterEndpoint http://localhost:4317
+--OpenTelemetryExcludeAdminRequests true
+```
+
+## Requirements
+
+- .NET 6.0 or later
+- WireMock.Net 1.6.0 or later
diff --git a/src/WireMock.Net.OpenTelemetry/WireMock.Net.OpenTelemetry.csproj b/src/WireMock.Net.OpenTelemetry/WireMock.Net.OpenTelemetry.csproj
new file mode 100644
index 00000000..155a7db2
--- /dev/null
+++ b/src/WireMock.Net.OpenTelemetry/WireMock.Net.OpenTelemetry.csproj
@@ -0,0 +1,38 @@
+
+
+
+
+ OpenTelemetry exporter support for WireMock.Net
+ WireMock.Net.OpenTelemetry
+ Petr Houška
+ net4.8;net8.0
+ true
+ WireMock.OpenTelemetry
+ wiremock;opentelemetry;otel;tracing;telemetry
+ {C8F4E6D2-9A3B-4F1C-8D5E-7A2B3C4D5E6F}
+ true
+ true
+ true
+ true
+ ../WireMock.Net/WireMock.Net.ruleset
+ true
+ ../WireMock.Net/WireMock.Net.snk
+ true
+ MIT
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/WireMock.Net.OpenTelemetry/WireMockOpenTelemetryExtensions.cs b/src/WireMock.Net.OpenTelemetry/WireMockOpenTelemetryExtensions.cs
new file mode 100644
index 00000000..d0b8f95a
--- /dev/null
+++ b/src/WireMock.Net.OpenTelemetry/WireMockOpenTelemetryExtensions.cs
@@ -0,0 +1,114 @@
+// Copyright © WireMock.Net
+
+using System;
+using Microsoft.Extensions.DependencyInjection;
+using OpenTelemetry.Resources;
+using OpenTelemetry.Trace;
+
+namespace WireMock.OpenTelemetry;
+
+///
+/// Extension methods for configuring OpenTelemetry tracing for WireMock.Net.
+///
+public static class WireMockOpenTelemetryExtensions
+{
+ private const string ServiceName = "WireMock.Net";
+ private const string WireMockActivitySourceName = "WireMock.Net";
+
+ ///
+ /// Adds OpenTelemetry tracing to the WireMock server with instrumentation and OTLP exporter.
+ /// This configures:
+ /// - WireMock.Net ActivitySource instrumentation (custom WireMock traces with mapping details)
+ /// - ASP.NET Core instrumentation (standard HTTP server traces)
+ /// - OTLP exporter to send traces to a collector
+ ///
+ /// The service collection.
+ /// The OpenTelemetry options containing exporter configuration.
+ /// The service collection for chaining.
+ public static IServiceCollection AddWireMockOpenTelemetry(
+ this IServiceCollection services,
+ OpenTelemetryOptions? options)
+ {
+ if (options is null)
+ {
+ return services;
+ }
+
+ services.AddOpenTelemetry()
+ .ConfigureResource(resource =>
+ {
+ resource.AddService(
+ serviceName: ServiceName,
+ serviceVersion: typeof(WireMockOpenTelemetryExtensions).Assembly.GetName().Version?.ToString() ?? "unknown"
+ );
+ })
+ .WithTracing(tracing =>
+ {
+ // Add WireMock-specific traces
+ tracing.AddSource(WireMockActivitySourceName);
+
+ // Add ASP.NET Core instrumentation for standard HTTP server traces
+ tracing.AddAspNetCoreInstrumentation(aspNetOptions =>
+ {
+ // Filter out admin requests if configured
+ if (options.ExcludeAdminRequests)
+ {
+ aspNetOptions.Filter = context =>
+ {
+ var path = context.Request.Path.Value ?? string.Empty;
+ return !path.StartsWith("/__admin", StringComparison.OrdinalIgnoreCase);
+ };
+ }
+ });
+
+ // Add OTLP exporter - automatically reads OTEL_EXPORTER_OTLP_ENDPOINT from environment
+ // If explicit endpoint is specified in options, use that instead
+ var otlpEndpoint = options.OtlpExporterEndpoint;
+ if (!string.IsNullOrEmpty(otlpEndpoint))
+ {
+ tracing.AddOtlpExporter(exporterOptions =>
+ {
+ exporterOptions.Endpoint = new Uri(otlpEndpoint);
+ });
+ }
+ else
+ {
+ // Use default - reads from OTEL_EXPORTER_OTLP_ENDPOINT env var
+ tracing.AddOtlpExporter();
+ }
+ });
+
+ return services;
+ }
+
+ ///
+ /// Configures OpenTelemetry tracing builder with WireMock.Net ActivitySource and ASP.NET Core instrumentation.
+ /// Use this method when you want more control over the TracerProvider configuration.
+ ///
+ /// The TracerProviderBuilder to configure.
+ /// The OpenTelemetry options (optional).
+ /// The TracerProviderBuilder for chaining.
+ public static TracerProviderBuilder AddWireMockInstrumentation(
+ this TracerProviderBuilder tracing,
+ OpenTelemetryOptions? options = null)
+ {
+ // Add WireMock-specific traces
+ tracing.AddSource(WireMockActivitySourceName);
+
+ // Add ASP.NET Core instrumentation for standard HTTP server traces
+ tracing.AddAspNetCoreInstrumentation(aspNetOptions =>
+ {
+ // Filter out admin requests if configured
+ if (options?.ExcludeAdminRequests == true)
+ {
+ aspNetOptions.Filter = context =>
+ {
+ var path = context.Request.Path.Value ?? string.Empty;
+ return !path.StartsWith("/__admin", StringComparison.OrdinalIgnoreCase);
+ };
+ }
+ });
+
+ return tracing;
+ }
+}
\ No newline at end of file
diff --git a/src/WireMock.Net.Minimal/Extensions/DictionaryExtensions.cs b/src/WireMock.Net.Shared/Extensions/DictionaryExtensions.cs
similarity index 99%
rename from src/WireMock.Net.Minimal/Extensions/DictionaryExtensions.cs
rename to src/WireMock.Net.Shared/Extensions/DictionaryExtensions.cs
index b80c6105..95310ff0 100644
--- a/src/WireMock.Net.Minimal/Extensions/DictionaryExtensions.cs
+++ b/src/WireMock.Net.Shared/Extensions/DictionaryExtensions.cs
@@ -28,4 +28,4 @@ internal static class DictionaryExtensions
value = default;
return false;
}
-}
\ No newline at end of file
+}
diff --git a/src/WireMock.Net.Shared/Properties/AssemblyInfo.cs b/src/WireMock.Net.Shared/Properties/AssemblyInfo.cs
index 2b4ab3ad..9bb112fd 100644
--- a/src/WireMock.Net.Shared/Properties/AssemblyInfo.cs
+++ b/src/WireMock.Net.Shared/Properties/AssemblyInfo.cs
@@ -7,6 +7,7 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("WireMock.Net.GraphQL, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
[assembly: InternalsVisibleTo("WireMock.Net.ProtoBuf, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
[assembly: InternalsVisibleTo("WireMock.Net.Matchers.CSharpCode, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
+[assembly: InternalsVisibleTo("WireMock.Net.OpenTelemetry, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
// [assembly: InternalsVisibleTo("WireMock.Net.StandAlone, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
[assembly: InternalsVisibleTo("WireMock.Net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e138ec44d93acac565953052636eb8d5e7e9f27ddb030590055cd1a0ab2069a5623f1f77ca907d78e0b37066ca0f6d63da7eecc3fcb65b76aa8ebeccf7ebe1d11264b8404cd9b1cbbf2c83f566e033b3e54129f6ef28daffff776ba7aebbc53c0d635ebad8f45f78eb3f7e0459023c218f003416e080f96a1a3c5ffeb56bee9e")]
diff --git a/src/WireMock.Net.Shared/Settings/ActivityTracingOptions.cs b/src/WireMock.Net.Shared/Settings/ActivityTracingOptions.cs
new file mode 100644
index 00000000..de443b29
--- /dev/null
+++ b/src/WireMock.Net.Shared/Settings/ActivityTracingOptions.cs
@@ -0,0 +1,42 @@
+// Copyright © WireMock.Net
+
+using JetBrains.Annotations;
+
+namespace WireMock.Settings;
+
+///
+/// Options for controlling activity tracing in WireMock.Net.
+/// These options control the creation of System.Diagnostics.Activity objects
+/// but do not require any OpenTelemetry exporter dependencies.
+///
+///
+/// To export traces to an OpenTelemetry collector, install the WireMock.Net.OpenTelemetry package
+/// and configure the exporter using the provided extension methods.
+///
+[PublicAPI]
+public class ActivityTracingOptions
+{
+ ///
+ /// Gets or sets a value indicating whether to exclude admin interface requests from activity tracing.
+ /// Default is true.
+ ///
+ public bool ExcludeAdminRequests { get; set; } = true;
+
+ ///
+ /// Gets or sets a value indicating whether to record request body in trace attributes.
+ /// Default is false due to potential PII concerns.
+ ///
+ public bool RecordRequestBody { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether to record response body in trace attributes.
+ /// Default is false due to potential PII concerns.
+ ///
+ public bool RecordResponseBody { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether to record mapping match details in trace attributes.
+ /// Default is true.
+ ///
+ public bool RecordMatchDetails { get; set; } = true;
+}
\ No newline at end of file
diff --git a/src/WireMock.Net.Minimal/Settings/SimpleSettingsParser.cs b/src/WireMock.Net.Shared/Settings/SimpleSettingsParser.cs
similarity index 94%
rename from src/WireMock.Net.Minimal/Settings/SimpleSettingsParser.cs
rename to src/WireMock.Net.Shared/Settings/SimpleSettingsParser.cs
index a02e06d2..322d687f 100644
--- a/src/WireMock.Net.Minimal/Settings/SimpleSettingsParser.cs
+++ b/src/WireMock.Net.Shared/Settings/SimpleSettingsParser.cs
@@ -104,6 +104,21 @@ internal class SimpleSettingsParser
}, defaultValue);
}
+ public bool GetBoolWithDefault(string key1, string key2, bool defaultValue)
+ {
+ if (Contains(key1))
+ {
+ return GetBoolValue(key1);
+ }
+
+ if (Contains(key2))
+ {
+ return GetBoolValue(key2);
+ }
+
+ return defaultValue;
+ }
+
public bool GetBoolSwitchValue(string name)
{
return Contains(name);
@@ -184,4 +199,4 @@ internal class SimpleSettingsParser
var value = GetValue(name, values => values.FirstOrDefault());
return string.IsNullOrWhiteSpace(value) ? default : JsonUtils.DeserializeObject(value);
}
-}
\ No newline at end of file
+}
diff --git a/src/WireMock.Net.Shared/Settings/WireMockServerSettings.cs b/src/WireMock.Net.Shared/Settings/WireMockServerSettings.cs
index dbe357f8..9df15904 100644
--- a/src/WireMock.Net.Shared/Settings/WireMockServerSettings.cs
+++ b/src/WireMock.Net.Shared/Settings/WireMockServerSettings.cs
@@ -335,4 +335,15 @@ public class WireMockServerSettings
///
[PublicAPI]
public HandlebarsSettings? HandlebarsSettings { get; set; }
+
+ ///
+ /// Gets or sets the activity tracing options.
+ /// When set (not null), WireMock.Net will create System.Diagnostics.Activity objects for request processing.
+ ///
+ ///
+ /// To export traces to an OpenTelemetry collector, install the WireMock.Net.OpenTelemetry package
+ /// and configure the exporter using the provided extension methods.
+ ///
+ [PublicAPI]
+ public ActivityTracingOptions? ActivityTracingOptions { get; set; }
}
\ No newline at end of file
diff --git a/src/WireMock.Net.StandAlone/StandAloneApp.cs b/src/WireMock.Net.StandAlone/StandAloneApp.cs
index 54889d80..a17d0b11 100644
--- a/src/WireMock.Net.StandAlone/StandAloneApp.cs
+++ b/src/WireMock.Net.StandAlone/StandAloneApp.cs
@@ -10,6 +10,9 @@ using WireMock.Exceptions;
using WireMock.Logging;
using WireMock.Server;
using WireMock.Settings;
+#if OPENTELEMETRY_SUPPORTED
+using WireMock.OpenTelemetry;
+#endif
namespace WireMock.Net.StandAlone;
@@ -37,6 +40,39 @@ public static class StandAloneApp
return server;
}
+#if OPENTELEMETRY_SUPPORTED
+ ///
+ /// Start WireMock.Net standalone Server based on the WireMockServerSettings with OpenTelemetry tracing.
+ ///
+ /// The WireMockServerSettings
+ /// The OpenTelemetry options for exporting traces.
+ [PublicAPI]
+ public static WireMockServer Start(WireMockServerSettings settings, OpenTelemetryOptions? openTelemetryOptions)
+ {
+ Guard.NotNull(settings);
+
+ // Wire up OpenTelemetry OTLP exporter if options are provided
+ if (openTelemetryOptions is not null)
+ {
+ // Enable activity tracing in settings so middleware creates activities
+ // Only set ExcludeAdminRequests if not already configured
+ settings.ActivityTracingOptions ??= new ActivityTracingOptions
+ {
+ ExcludeAdminRequests = openTelemetryOptions.ExcludeAdminRequests
+ };
+
+ var existingRegistration = settings.AdditionalServiceRegistration;
+ settings.AdditionalServiceRegistration = services =>
+ {
+ existingRegistration?.Invoke(services);
+ services.AddWireMockOpenTelemetry(openTelemetryOptions);
+ };
+ }
+
+ return Start(settings);
+ }
+#endif
+
///
/// Start WireMock.Net standalone Server based on the commandline arguments.
///
@@ -71,7 +107,13 @@ public static class StandAloneApp
settings.Logger?.Info("Version [{0}]", Version);
settings.Logger?.Debug("Server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
+#if OPENTELEMETRY_SUPPORTED
+ // Parse OpenTelemetry options separately using the OTEL project parser
+ OpenTelemetryOptionsParser.TryParseArguments(args, Environment.GetEnvironmentVariables(), out var openTelemetryOptions);
+ server = Start(settings, openTelemetryOptions);
+#else
server = Start(settings);
+#endif
return true;
}
diff --git a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj b/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj
index c0e7aca8..519a3bfa 100644
--- a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj
+++ b/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj
@@ -28,6 +28,12 @@
true
+
+
+
+ $(DefineConstants);OPENTELEMETRY_SUPPORTED
+
+
all
@@ -38,4 +44,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj
index 6b47c25a..040394cf 100644
--- a/src/WireMock.Net/WireMock.Net.csproj
+++ b/src/WireMock.Net/WireMock.Net.csproj
@@ -34,6 +34,6 @@
+
-
\ No newline at end of file
diff --git a/test/WireMock.Net.Aspire.TestAppHost/WireMock.Net.Aspire.TestAppHost.csproj b/test/WireMock.Net.Aspire.TestAppHost/WireMock.Net.Aspire.TestAppHost.csproj
index 16d5e97c..96f2bb2f 100644
--- a/test/WireMock.Net.Aspire.TestAppHost/WireMock.Net.Aspire.TestAppHost.csproj
+++ b/test/WireMock.Net.Aspire.TestAppHost/WireMock.Net.Aspire.TestAppHost.csproj
@@ -1,6 +1,6 @@
-
+
Exe
@@ -19,7 +19,7 @@
-
+
diff --git a/test/WireMock.Net.Aspire.Tests/IntegrationTests.cs b/test/WireMock.Net.Aspire.Tests/IntegrationTests.cs
index 348479a4..2a0ab465 100644
--- a/test/WireMock.Net.Aspire.Tests/IntegrationTests.cs
+++ b/test/WireMock.Net.Aspire.Tests/IntegrationTests.cs
@@ -27,11 +27,11 @@ public class IntegrationTests(ITestOutputHelper output)
var weatherForecasts1 = await httpClient.GetFromJsonAsync("/weatherforecast");
// Assert 1
- weatherForecasts1.Should().BeEquivalentTo(new[]
- {
+ weatherForecasts1.Should().BeEquivalentTo(
+ [
new WeatherForecast(new DateOnly(2024, 5, 24), -10, "Freezing"),
new WeatherForecast(new DateOnly(2024, 5, 25), +33, "Hot")
- });
+ ]);
// Act 2
var weatherForecasts2 = await httpClient.GetFromJsonAsync("/weatherforecast2");
diff --git a/test/WireMock.Net.Aspire.Tests/WireMock.Net.Aspire.Tests.csproj b/test/WireMock.Net.Aspire.Tests/WireMock.Net.Aspire.Tests.csproj
index 6b11ee4c..81316d56 100644
--- a/test/WireMock.Net.Aspire.Tests/WireMock.Net.Aspire.Tests.csproj
+++ b/test/WireMock.Net.Aspire.Tests/WireMock.Net.Aspire.Tests.csproj
@@ -13,7 +13,7 @@
-
+
all
diff --git a/test/WireMock.Net.Tests/OpenTelemetry/OpenTelemetryOptionsParserTests.cs b/test/WireMock.Net.Tests/OpenTelemetry/OpenTelemetryOptionsParserTests.cs
new file mode 100644
index 00000000..f3b3c303
--- /dev/null
+++ b/test/WireMock.Net.Tests/OpenTelemetry/OpenTelemetryOptionsParserTests.cs
@@ -0,0 +1,40 @@
+// Copyright © WireMock.Net
+
+using System;
+using FluentAssertions;
+using WireMock.OpenTelemetry;
+using Xunit;
+
+namespace WireMock.Net.Tests.OpenTelemetry;
+
+public class OpenTelemetryOptionsParserTests
+{
+ [Fact]
+ public void TryParseArguments_Enabled_ShouldReturnOptions()
+ {
+ // Act
+ var result = OpenTelemetryOptionsParser.TryParseArguments(
+ [
+ "--OpenTelemetryEnabled", "true",
+ "--OpenTelemetryExcludeAdminRequests", "false",
+ "--OpenTelemetryOtlpExporterEndpoint", "http://localhost:4317"
+ ], null, out var options);
+
+ // Assert
+ result.Should().BeTrue();
+ options.Should().NotBeNull();
+ options!.ExcludeAdminRequests.Should().BeFalse();
+ options.OtlpExporterEndpoint.Should().Be("http://localhost:4317");
+ }
+
+ [Fact]
+ public void TryParseArguments_NotEnabled_ShouldReturnNull()
+ {
+ // Act
+ var result = OpenTelemetryOptionsParser.TryParseArguments(Array.Empty(), null, out var options);
+
+ // Assert
+ result.Should().BeTrue();
+ options.Should().BeNull();
+ }
+}
\ No newline at end of file
diff --git a/test/WireMock.Net.Tests/OpenTelemetry/WireMockOpenTelemetryExtensionsTests.cs b/test/WireMock.Net.Tests/OpenTelemetry/WireMockOpenTelemetryExtensionsTests.cs
new file mode 100644
index 00000000..b754294d
--- /dev/null
+++ b/test/WireMock.Net.Tests/OpenTelemetry/WireMockOpenTelemetryExtensionsTests.cs
@@ -0,0 +1,43 @@
+// Copyright © WireMock.Net
+
+#if NET6_0_OR_GREATER
+using FluentAssertions;
+using Microsoft.Extensions.DependencyInjection;
+using WireMock.OpenTelemetry;
+using Xunit;
+
+namespace WireMock.Net.Tests.OpenTelemetry;
+
+public class WireMockOpenTelemetryExtensionsTests
+{
+ [Fact]
+ public void AddWireMockOpenTelemetry_WithNullOptions_ShouldNotAddServices()
+ {
+ // Arrange
+ var services = new ServiceCollection();
+ var initialCount = services.Count;
+
+ // Act
+ var result = services.AddWireMockOpenTelemetry(null);
+
+ // Assert
+ result.Should().BeSameAs(services);
+ services.Count.Should().Be(initialCount);
+ }
+
+ [Fact]
+ public void AddWireMockOpenTelemetry_WithOptions_ShouldAddServices()
+ {
+ // Arrange
+ var services = new ServiceCollection();
+ var initialCount = services.Count;
+
+ // Act
+ var result = services.AddWireMockOpenTelemetry(new OpenTelemetryOptions());
+
+ // Assert
+ result.Should().BeSameAs(services);
+ services.Count.Should().BeGreaterThan(initialCount);
+ }
+}
+#endif
diff --git a/test/WireMock.Net.Tests/Owin/ActivityTracing/WireMockActivitySourceTests.cs b/test/WireMock.Net.Tests/Owin/ActivityTracing/WireMockActivitySourceTests.cs
new file mode 100644
index 00000000..a870e5c6
--- /dev/null
+++ b/test/WireMock.Net.Tests/Owin/ActivityTracing/WireMockActivitySourceTests.cs
@@ -0,0 +1,193 @@
+// Copyright © WireMock.Net
+
+using System;
+using System.Diagnostics;
+using FluentAssertions;
+using Moq;
+using WireMock.Logging;
+using WireMock.Matchers.Request;
+using WireMock.Models;
+using WireMock.Owin.ActivityTracing;
+using WireMock.Settings;
+using WireMock.Util;
+using Xunit;
+
+namespace WireMock.Net.Tests.Owin.ActivityTracing;
+
+public class WireMockActivitySourceTests
+{
+ [Fact]
+ public void EnrichWithRequest_ShouldSetRequestTagsAndBody_WhenEnabled()
+ {
+ // Arrange
+ using var activity = new Activity("test").Start();
+ var request = new RequestMessage(
+ new UrlDetails("http://localhost/api/orders"),
+ "POST",
+ "127.0.0.1",
+ new BodyData { BodyAsString = "payload" });
+
+ var options = new ActivityTracingOptions
+ {
+ RecordRequestBody = true
+ };
+
+ // Act
+ WireMockActivitySource.EnrichWithRequest(activity, request, options);
+
+ // Assert
+ activity.GetTagItem(WireMockSemanticConventions.HttpMethod).Should().Be("POST");
+ activity.GetTagItem(WireMockSemanticConventions.HttpUrl).Should().Be("http://localhost/api/orders");
+ activity.GetTagItem(WireMockSemanticConventions.HttpPath).Should().Be("/api/orders");
+ activity.GetTagItem(WireMockSemanticConventions.HttpHost).Should().Be("localhost");
+ activity.GetTagItem(WireMockSemanticConventions.ClientAddress).Should().Be("127.0.0.1");
+ activity.GetTagItem(WireMockSemanticConventions.RequestBody).Should().Be("payload");
+ }
+
+ [Fact]
+ public void EnrichWithResponse_ShouldSetStatusAndBody_WhenEnabled()
+ {
+ // Arrange
+ using var activity = new Activity("test").Start();
+ var response = new ResponseMessage
+ {
+ StatusCode = 200,
+ BodyData = new BodyData { BodyAsString = "ok" }
+ };
+
+ var options = new ActivityTracingOptions
+ {
+ RecordResponseBody = true
+ };
+
+ // Act
+ WireMockActivitySource.EnrichWithResponse(activity, response, options);
+
+ // Assert
+ activity.GetTagItem(WireMockSemanticConventions.HttpStatusCode).Should().Be(200);
+ activity.GetTagItem("otel.status_code").Should().Be("OK");
+ activity.GetTagItem(WireMockSemanticConventions.ResponseBody).Should().Be("ok");
+ }
+
+ [Fact]
+ public void EnrichWithResponse_ShouldSetErrorStatus_ForNonSuccess()
+ {
+ // Arrange
+ using var activity = new Activity("test").Start();
+ var response = new ResponseMessage
+ {
+ StatusCode = 500
+ };
+
+ // Act
+ WireMockActivitySource.EnrichWithResponse(activity, response, new ActivityTracingOptions());
+
+ // Assert
+ activity.GetTagItem(WireMockSemanticConventions.HttpStatusCode).Should().Be(500);
+ activity.GetTagItem("otel.status_code").Should().Be("ERROR");
+ }
+
+ [Fact]
+ public void EnrichWithRequest_ShouldNotRecordBody_WhenDisabled()
+ {
+ // Arrange
+ using var activity = new Activity("test").Start();
+ var request = new RequestMessage(
+ new UrlDetails("http://localhost/api/orders"),
+ "POST",
+ "127.0.0.1",
+ new BodyData { BodyAsString = "payload" });
+
+ var options = new ActivityTracingOptions
+ {
+ RecordRequestBody = false
+ };
+
+ // Act
+ WireMockActivitySource.EnrichWithRequest(activity, request, options);
+
+ // Assert
+ activity.GetTagItem(WireMockSemanticConventions.RequestBody).Should().BeNull();
+ }
+
+ [Fact]
+ public void EnrichWithResponse_ShouldNotRecordBody_WhenDisabled()
+ {
+ // Arrange
+ using var activity = new Activity("test").Start();
+ var response = new ResponseMessage
+ {
+ StatusCode = 200,
+ BodyData = new BodyData { BodyAsString = "ok" }
+ };
+
+ var options = new ActivityTracingOptions
+ {
+ RecordResponseBody = false
+ };
+
+ // Act
+ WireMockActivitySource.EnrichWithResponse(activity, response, options);
+
+ // Assert
+ activity.GetTagItem(WireMockSemanticConventions.ResponseBody).Should().BeNull();
+ }
+
+ [Fact]
+ public void EnrichWithLogEntry_ShouldSkipMatchDetails_WhenDisabled()
+ {
+ // Arrange
+ using var activity = new Activity("test").Start();
+ var request = new RequestMessage(
+ new UrlDetails("http://localhost/api/orders"),
+ "GET",
+ "127.0.0.1");
+ var response = new ResponseMessage { StatusCode = 200 };
+
+ var matchResult = new Mock();
+ matchResult.SetupGet(r => r.IsPerfectMatch).Returns(true);
+ matchResult.SetupGet(r => r.TotalScore).Returns(1.0);
+
+ var logEntry = new LogEntry
+ {
+ Guid = Guid.NewGuid(),
+ RequestMessage = request,
+ ResponseMessage = response,
+ RequestMatchResult = matchResult.Object,
+ MappingGuid = Guid.NewGuid(),
+ MappingTitle = "test-mapping"
+ };
+
+ var options = new ActivityTracingOptions
+ {
+ RecordMatchDetails = false
+ };
+
+ // Act
+ WireMockActivitySource.EnrichWithLogEntry(activity, logEntry, options);
+
+ // Assert
+ activity.GetTagItem(WireMockSemanticConventions.RequestGuid).Should().Be(logEntry.Guid.ToString());
+ activity.Tags.Should().NotContain(tag => tag.Key == WireMockSemanticConventions.MappingGuid);
+ activity.Tags.Should().NotContain(tag => tag.Key == WireMockSemanticConventions.MappingTitle);
+ activity.Tags.Should().NotContain(tag => tag.Key == WireMockSemanticConventions.MatchScore);
+ }
+
+ [Fact]
+ public void RecordException_ShouldSetExceptionTags()
+ {
+ // Arrange
+ using var activity = new Activity("test").Start();
+ var exception = new InvalidOperationException("boom");
+
+ // Act
+ WireMockActivitySource.RecordException(activity, exception);
+
+ // Assert
+ activity.GetTagItem("otel.status_code").Should().Be("ERROR");
+ activity.GetTagItem("otel.status_description").Should().Be("boom");
+ activity.GetTagItem("exception.type").Should().Be(typeof(InvalidOperationException).FullName);
+ activity.GetTagItem("exception.message").Should().Be("boom");
+ activity.GetTagItem("exception.stacktrace").Should().NotBeNull();
+ }
+}
\ No newline at end of file
diff --git a/test/WireMock.Net.Tests/Owin/WireMockMiddlewareTests.cs b/test/WireMock.Net.Tests/Owin/WireMockMiddlewareTests.cs
index b9f1cba0..f6296e2d 100644
--- a/test/WireMock.Net.Tests/Owin/WireMockMiddlewareTests.cs
+++ b/test/WireMock.Net.Tests/Owin/WireMockMiddlewareTests.cs
@@ -13,6 +13,9 @@ using WireMock.Util;
using WireMock.Logging;
using WireMock.Matchers;
using System.Collections.Generic;
+#if NET6_0_OR_GREATER
+using System.Diagnostics;
+#endif
using WireMock.Admin.Mappings;
using WireMock.Admin.Requests;
using WireMock.Settings;
@@ -21,13 +24,15 @@ using WireMock.Handlers;
using WireMock.Matchers.Request;
using WireMock.ResponseBuilders;
using WireMock.RequestBuilders;
+#if NET6_0_OR_GREATER
+using WireMock.Owin.ActivityTracing;
+#endif
#if NET452
using Microsoft.Owin;
using IContext = Microsoft.Owin.IOwinContext;
using IRequest = Microsoft.Owin.IOwinRequest;
using IResponse = Microsoft.Owin.IOwinResponse;
#else
-using Microsoft.AspNetCore.Http;
using IContext = Microsoft.AspNetCore.Http.HttpContext;
using IRequest = Microsoft.AspNetCore.Http.HttpRequest;
using IResponse = Microsoft.AspNetCore.Http.HttpResponse;
@@ -84,10 +89,10 @@ public class WireMockMiddlewareTests
_requestMatchResultMock = new Mock();
_requestMatchResultMock.Setup(r => r.TotalNumber).Returns(1);
- _requestMatchResultMock.Setup(r => r.MatchDetails).Returns(new List());
+ _requestMatchResultMock.Setup(r => r.MatchDetails).Returns([]);
_sut = new WireMockMiddleware(
- null,
+ _ => Task.CompletedTask,
_optionsMock.Object,
_requestMapperMock.Object,
_responseMapperMock.Object,
@@ -278,7 +283,7 @@ public class WireMockMiddlewareTests
var requestBuilder = Request.Create().UsingAnyMethod();
_mappingMock.SetupGet(m => m.RequestMatcher).Returns(requestBuilder);
- var result = new MappingMatcherResult (_mappingMock.Object, _requestMatchResultMock.Object);
+ var result = new MappingMatcherResult(_mappingMock.Object, _requestMatchResultMock.Object);
_matcherMock.Setup(m => m.FindBestMatch(It.IsAny())).Returns((result, result));
// Act
@@ -289,4 +294,90 @@ public class WireMockMiddlewareTests
_mappings.Should().HaveCount(1);
}
+
+#if NET6_0_OR_GREATER
+ [Fact]
+ public async Task WireMockMiddleware_Invoke_AdminPath_WithExcludeAdminRequests_ShouldNotStartActivity()
+ {
+ // Arrange
+ var request = new RequestMessage(new UrlDetails("http://localhost/__admin/health"), "GET", "::1");
+ _requestMapperMock.Setup(m => m.MapAsync(It.IsAny(), It.IsAny())).ReturnsAsync(request);
+
+ _optionsMock.SetupGet(o => o.ActivityTracingOptions).Returns(new ActivityTracingOptions
+ {
+ ExcludeAdminRequests = true
+ });
+
+ var activityStarted = false;
+ using var listener = new ActivityListener
+ {
+ ShouldListenTo = source => source.Name == WireMockActivitySource.SourceName,
+ Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllDataAndRecorded,
+ ActivityStarted = _ => activityStarted = true
+ };
+
+ ActivitySource.AddActivityListener(listener);
+
+ // Act
+ await _sut.Invoke(_contextMock.Object);
+
+ // Assert
+ activityStarted.Should().BeFalse();
+ }
+
+ [Fact]
+ public async Task WireMockMiddleware_Invoke_NonAdminPath_WithTracingEnabled_ShouldStartActivity()
+ {
+ // Arrange
+ var request = new RequestMessage(new UrlDetails("http://localhost/api/orders"), "GET", "::1");
+ _requestMapperMock.Setup(m => m.MapAsync(It.IsAny(), It.IsAny())).ReturnsAsync(request);
+
+ _optionsMock.SetupGet(o => o.ActivityTracingOptions).Returns(new ActivityTracingOptions
+ {
+ ExcludeAdminRequests = true
+ });
+
+ var activityStarted = false;
+ using var listener = new ActivityListener
+ {
+ ShouldListenTo = source => source.Name == WireMockActivitySource.SourceName,
+ Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllDataAndRecorded,
+ ActivityStarted = _ => activityStarted = true
+ };
+
+ ActivitySource.AddActivityListener(listener);
+
+ // Act
+ await _sut.Invoke(_contextMock.Object);
+
+ // Assert
+ activityStarted.Should().BeTrue();
+ }
+
+ [Fact]
+ public async Task WireMockMiddleware_Invoke_NonAdminPath_WithoutTracingOptions_ShouldNotStartActivity()
+ {
+ // Arrange
+ var request = new RequestMessage(new UrlDetails("http://localhost/api/orders"), "GET", "::1");
+ _requestMapperMock.Setup(m => m.MapAsync(It.IsAny(), It.IsAny())).ReturnsAsync(request);
+
+ _optionsMock.SetupGet(o => o.ActivityTracingOptions).Returns((ActivityTracingOptions?)null);
+
+ var activityStarted = false;
+ using var listener = new ActivityListener
+ {
+ ShouldListenTo = source => source.Name == WireMockActivitySource.SourceName,
+ Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllDataAndRecorded,
+ ActivityStarted = _ => activityStarted = true
+ };
+
+ ActivitySource.AddActivityListener(listener);
+
+ // Act
+ await _sut.Invoke(_contextMock.Object);
+
+ // Assert
+ activityStarted.Should().BeFalse();
+ }
+#endif
}
\ No newline at end of file
diff --git a/test/WireMock.Net.Tests/Settings/SimpleSettingsParserTests.cs b/test/WireMock.Net.Tests/Settings/SimpleSettingsParserTests.cs
index cbbd7f08..88c56ae0 100644
--- a/test/WireMock.Net.Tests/Settings/SimpleSettingsParserTests.cs
+++ b/test/WireMock.Net.Tests/Settings/SimpleSettingsParserTests.cs
@@ -112,6 +112,23 @@ public class SimpleSettingsParserTests
Check.That(value3).IsEqualTo(true);
}
+ [Fact]
+ public void SimpleCommandLineParser_Parse_GetBoolWithDefault()
+ {
+ // Assign
+ _parser.Parse(new[] { "--test1", "true", "--test2", "false" });
+
+ // Act
+ bool value1 = _parser.GetBoolWithDefault("test1", "test1_fallback", defaultValue: false);
+ bool value2 = _parser.GetBoolWithDefault("missing", "test2", defaultValue: true);
+ bool value3 = _parser.GetBoolWithDefault("missing1", "missing2", defaultValue: true);
+
+ // Assert
+ Check.That(value1).IsEqualTo(true);
+ Check.That(value2).IsEqualTo(false);
+ Check.That(value3).IsEqualTo(true);
+ }
+
[Fact]
public void SimpleCommandLineParser_Parse_Environment_GetBoolValue()
{
diff --git a/test/WireMock.Net.Tests/Settings/WireMockServerSettingsParserTests.cs b/test/WireMock.Net.Tests/Settings/WireMockServerSettingsParserTests.cs
index 56d4a2d1..274c1468 100644
--- a/test/WireMock.Net.Tests/Settings/WireMockServerSettingsParserTests.cs
+++ b/test/WireMock.Net.Tests/Settings/WireMockServerSettingsParserTests.cs
@@ -34,4 +34,26 @@ public class WireMockServerSettingsParserTests
settings.Should().NotBeNull();
settings!.AdminPath.Should().Be("/__admin");
}
+
+ [Fact]
+ public void TryParseArguments_With_ActivityTracingEnabled_ShouldParseOptions()
+ {
+ // Act
+ var result = WireMockServerSettingsParser.TryParseArguments(new[]
+ {
+ "--ActivityTracingEnabled", "true",
+ "--ActivityTracingExcludeAdminRequests", "false",
+ "--ActivityTracingRecordRequestBody", "true",
+ "--ActivityTracingRecordResponseBody", "true"
+ }, null, out var settings);
+
+ // Assert
+ result.Should().BeTrue();
+ settings.Should().NotBeNull();
+ settings!.ActivityTracingOptions.Should().NotBeNull();
+ settings.ActivityTracingOptions!.ExcludeAdminRequests.Should().BeFalse();
+ settings.ActivityTracingOptions.RecordRequestBody.Should().BeTrue();
+ settings.ActivityTracingOptions.RecordResponseBody.Should().BeTrue();
+ settings.ActivityTracingOptions.RecordMatchDetails.Should().BeTrue();
+ }
}
\ No newline at end of file
diff --git a/test/WireMock.Net.Tests/WireMockServer.Settings.cs b/test/WireMock.Net.Tests/WireMockServer.Settings.cs
index 91defc85..7a82e8a9 100644
--- a/test/WireMock.Net.Tests/WireMockServer.Settings.cs
+++ b/test/WireMock.Net.Tests/WireMockServer.Settings.cs
@@ -194,4 +194,41 @@ public class WireMockServerSettingsTests
var options = server.GetPrivateFieldValue("_options");
Check.That(options.RequestLogExpirationDuration).IsEqualTo(1);
}
+
+#if NET6_0_OR_GREATER
+ [Fact]
+ public void WireMockServer_WireMockServerSettings_ActivityTracingOptions_AreMappedToMiddlewareOptions()
+ {
+ // Assign and Act
+ var server = WireMockServer.Start(new WireMockServerSettings
+ {
+ ActivityTracingOptions = new ActivityTracingOptions
+ {
+ ExcludeAdminRequests = false,
+ RecordRequestBody = true,
+ RecordResponseBody = true,
+ RecordMatchDetails = false
+ }
+ });
+
+ // Assert
+ var options = server.GetPrivateFieldValue("_options");
+ options.ActivityTracingOptions.Should().NotBeNull();
+ options.ActivityTracingOptions!.ExcludeAdminRequests.Should().BeFalse();
+ options.ActivityTracingOptions.RecordRequestBody.Should().BeTrue();
+ options.ActivityTracingOptions.RecordResponseBody.Should().BeTrue();
+ options.ActivityTracingOptions.RecordMatchDetails.Should().BeFalse();
+ }
+
+ [Fact]
+ public void WireMockServer_WireMockServerSettings_Without_ActivityTracingOptions_ShouldNotSetMiddlewareOptions()
+ {
+ // Assign and Act
+ var server = WireMockServer.Start(new WireMockServerSettings());
+
+ // Assert
+ var options = server.GetPrivateFieldValue("_options");
+ options.ActivityTracingOptions.Should().BeNull();
+ }
+#endif
}
\ No newline at end of file