diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index 4d7efb1d9d..5f1c7ea4d8 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp; using Volo.Abp.AspNetCore.Auditing; using Volo.Abp.AspNetCore.Mvc.ExceptionHandling; +using Volo.Abp.AspNetCore.Tracing; using Volo.Abp.AspNetCore.Uow; using Volo.Abp.DependencyInjection; using Volo.Abp.Localization; @@ -40,6 +41,12 @@ namespace Microsoft.AspNetCore.Builder .UseMiddleware(); } + public static IApplicationBuilder UseCorrelationId(this IApplicationBuilder app) + { + return app + .UseMiddleware(); + } + public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app) { IReadOnlyList languages; diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Tracing/AbpCorrelationIdMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Tracing/AbpCorrelationIdMiddleware.cs new file mode 100644 index 0000000000..c96a760aad --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Tracing/AbpCorrelationIdMiddleware.cs @@ -0,0 +1,58 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Options; +using System.Threading.Tasks; +using Volo.Abp.Tracing; + +namespace Volo.Abp.AspNetCore.Tracing +{ + public class AbpCorrelationIdMiddleware + { + private readonly RequestDelegate _next; + + public AbpCorrelationIdMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke( + HttpContext httpContext, + IOptions options, + ICorrelationIdProvider correlationIdProvider) + { + var correlationId = correlationIdProvider.Get(); + var optionsValue = options.Value; + + try + { + await _next(httpContext); + } + finally + { + CheckAndSetCorrelationIdOnResponse(httpContext, optionsValue, correlationId); + } + } + + protected virtual void CheckAndSetCorrelationIdOnResponse( + HttpContext httpContext, + CorrelationIdOptions options, + string correlationId) + { + if (httpContext.Response.HasStarted) + { + return; + } + + if (!options.SetResponseHeader) + { + return; + } + + if (httpContext.Response.Headers.ContainsKey(options.HttpHeaderName)) + { + return; + } + + httpContext.Response.Headers[options.HttpHeaderName] = correlationId; + } + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Tracing/CorrelationIdOptions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Tracing/CorrelationIdOptions.cs index f97d240b05..0b794674ad 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Tracing/CorrelationIdOptions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Tracing/CorrelationIdOptions.cs @@ -3,5 +3,7 @@ public class CorrelationIdOptions { public string HttpHeaderName { get; set; } = "X-Correlation-Id"; + + public bool SetResponseHeader { get; set; } = true; } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index c1298d0e27..b079b38188 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -82,6 +82,7 @@ namespace Volo.Abp.AspNetCore.Mvc { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseMiddleware(); app.UseAuditing(); app.UseUnitOfWork(); diff --git a/samples/MicroserviceDemo/applications/AuthServer.Host/AuthServerHostModule.cs b/samples/MicroserviceDemo/applications/AuthServer.Host/AuthServerHostModule.cs index 52ec9db6ce..bc0d0b825d 100644 --- a/samples/MicroserviceDemo/applications/AuthServer.Host/AuthServerHostModule.cs +++ b/samples/MicroserviceDemo/applications/AuthServer.Host/AuthServerHostModule.cs @@ -73,6 +73,7 @@ namespace AuthServer.Host { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseVirtualFiles(); app.UseIdentityServer(); app.UseAbpRequestLocalization(); diff --git a/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminAppHostModule.cs b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminAppHostModule.cs index d687cd8933..5969d69370 100644 --- a/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminAppHostModule.cs +++ b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BackendAdminAppHostModule.cs @@ -89,6 +89,7 @@ namespace BackendAdminApp.Host { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseVirtualFiles(); app.UseAuthentication(); app.UseAbpRequestLocalization(); diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSiteHostModule.cs b/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSiteHostModule.cs index dab1006ec0..3591fc018d 100644 --- a/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSiteHostModule.cs +++ b/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSiteHostModule.cs @@ -81,6 +81,7 @@ namespace PublicWebSite.Host { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseVirtualFiles(); app.UseAuthentication(); app.UseAbpRequestLocalization(); diff --git a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs index d0549dcfc1..2eec37609b 100644 --- a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs +++ b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs @@ -81,6 +81,7 @@ namespace BackendAdminAppGateway.Host { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseVirtualFiles(); app.UseAuthentication(); app.UseSwagger(); diff --git a/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs b/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs index b869e121c8..68c98a26a2 100644 --- a/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs +++ b/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs @@ -70,6 +70,7 @@ namespace InternalGateway.Host { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseVirtualFiles(); app.UseAuthentication(); app.UseSwagger(); diff --git a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGatewayHostModule.cs b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGatewayHostModule.cs index 33874d6438..36b52cc1e3 100644 --- a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGatewayHostModule.cs +++ b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGatewayHostModule.cs @@ -70,6 +70,7 @@ namespace PublicWebSiteGateway.Host { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseVirtualFiles(); app.UseAuthentication(); app.UseSwagger(); diff --git a/samples/MicroserviceDemo/microservices/BloggingService.Host/BloggingServiceHostModule.cs b/samples/MicroserviceDemo/microservices/BloggingService.Host/BloggingServiceHostModule.cs index 2855fbf099..1ae68cfd55 100644 --- a/samples/MicroserviceDemo/microservices/BloggingService.Host/BloggingServiceHostModule.cs +++ b/samples/MicroserviceDemo/microservices/BloggingService.Host/BloggingServiceHostModule.cs @@ -93,6 +93,7 @@ namespace BloggingService.Host { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseVirtualFiles(); app.UseAuthentication(); app.UseAbpRequestLocalization(); //TODO: localization? diff --git a/samples/MicroserviceDemo/microservices/IdentityService.Host/IdentityServiceHostModule.cs b/samples/MicroserviceDemo/microservices/IdentityService.Host/IdentityServiceHostModule.cs index b802be19b4..9dd68c9f39 100644 --- a/samples/MicroserviceDemo/microservices/IdentityService.Host/IdentityServiceHostModule.cs +++ b/samples/MicroserviceDemo/microservices/IdentityService.Host/IdentityServiceHostModule.cs @@ -84,6 +84,7 @@ namespace IdentityService.Host { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseVirtualFiles(); app.UseAuthentication(); app.UseAbpRequestLocalization(); //TODO: localization? diff --git a/samples/MicroserviceDemo/microservices/ProductService.Host/ProductServiceHostModule.cs b/samples/MicroserviceDemo/microservices/ProductService.Host/ProductServiceHostModule.cs index 683b11803c..c09fb4fcc1 100644 --- a/samples/MicroserviceDemo/microservices/ProductService.Host/ProductServiceHostModule.cs +++ b/samples/MicroserviceDemo/microservices/ProductService.Host/ProductServiceHostModule.cs @@ -84,6 +84,7 @@ namespace ProductService.Host { var app = context.GetApplicationBuilder(); + app.UseCorrelationId(); app.UseVirtualFiles(); app.UseAuthentication(); app.UseAbpRequestLocalization(); //TODO: localization?