Browse Source

Change current ICorrelationIdProvider implementations.

pull/16795/head
maliming 3 years ago
parent
commit
81ae954ceb
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 13
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Tracing/AspNetCoreCorrelationIdProvider.cs
  2. 21
      framework/src/Volo.Abp.Core/Volo/Abp/Tracing/DefaultCorrelationIdProvider.cs
  3. 5
      framework/src/Volo.Abp.Core/Volo/Abp/Tracing/ICorrelationIdProvider.cs
  4. 17
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/CorrelationIdProvider/CorrelationIdProviderController.cs
  5. 48
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/CorrelationIdProvider/CorrelationIdProvider_Tests.cs
  6. 34
      framework/test/Volo.Abp.Core.Tests/Volo/Abp/CorrelationIdProvider/CorrelationIdProvider_Tests.cs

13
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Tracing/AspNetCoreCorrelationIdProvider.cs

@ -7,7 +7,7 @@ using Volo.Abp.Tracing;
namespace Volo.Abp.AspNetCore.Tracing;
[Dependency(ReplaceServices = true)]
public class AspNetCoreCorrelationIdProvider : ICorrelationIdProvider, ITransientDependency
public class AspNetCoreCorrelationIdProvider : DefaultCorrelationIdProvider, ITransientDependency
{
protected IHttpContextAccessor HttpContextAccessor { get; }
protected AbpCorrelationIdOptions Options { get; }
@ -20,11 +20,11 @@ public class AspNetCoreCorrelationIdProvider : ICorrelationIdProvider, ITransien
Options = options.Value;
}
public virtual string Get()
protected override string GetDefaultCorrelationId()
{
if (HttpContextAccessor.HttpContext?.Request?.Headers == null)
{
return CreateNewCorrelationId();
return base.GetDefaultCorrelationId();
}
string correlationId = HttpContextAccessor.HttpContext.Request.Headers[Options.HttpHeaderName];
@ -35,7 +35,7 @@ public class AspNetCoreCorrelationIdProvider : ICorrelationIdProvider, ITransien
{
if (correlationId.IsNullOrEmpty())
{
correlationId = CreateNewCorrelationId();
correlationId = base.GetDefaultCorrelationId();;
HttpContextAccessor.HttpContext.Request.Headers[Options.HttpHeaderName] = correlationId;
}
}
@ -43,9 +43,4 @@ public class AspNetCoreCorrelationIdProvider : ICorrelationIdProvider, ITransien
return correlationId;
}
protected virtual string CreateNewCorrelationId()
{
return Guid.NewGuid().ToString("N");
}
}

21
framework/src/Volo.Abp.Core/Volo/Abp/Tracing/DefaultCorrelationIdProvider.cs

@ -1,16 +1,31 @@
using System;
using System.Threading;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Tracing;
public class DefaultCorrelationIdProvider : ICorrelationIdProvider, ISingletonDependency
{
public string Get()
private readonly AsyncLocal<string> _currentCorrelationId = new AsyncLocal<string>();
private string CorrelationId => _currentCorrelationId.Value ?? GetDefaultCorrelationId();
public virtual string Get()
{
return CorrelationId;
}
public virtual IDisposable Change(string correlationId)
{
return CreateNewCorrelationId();
var parent = CorrelationId;
_currentCorrelationId.Value = correlationId;
return new DisposeAction(() =>
{
_currentCorrelationId.Value = parent;
});
}
protected virtual string CreateNewCorrelationId()
protected virtual string GetDefaultCorrelationId()
{
return Guid.NewGuid().ToString("N");
}

5
framework/src/Volo.Abp.Core/Volo/Abp/Tracing/ICorrelationIdProvider.cs

@ -1,4 +1,5 @@
using JetBrains.Annotations;
using System;
using JetBrains.Annotations;
namespace Volo.Abp.Tracing;
@ -6,4 +7,6 @@ public interface ICorrelationIdProvider
{
[NotNull]
string Get();
IDisposable Change(string correlationId);
}

17
framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/CorrelationIdProvider/CorrelationIdProviderController.cs

@ -0,0 +1,17 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Tracing;
namespace Volo.Abp.AspNetCore.CorrelationIdProvider;
[Route("api/correlation")]
public class CorrelationIdProviderController : AbpController
{
[HttpGet]
[Route("get")]
public string Get()
{
return this.HttpContext.RequestServices.GetRequiredService<ICorrelationIdProvider>().Get();
}
}

48
framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/CorrelationIdProvider/CorrelationIdProvider_Tests.cs

@ -0,0 +1,48 @@
using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.AspNetCore.Mvc;
using Xunit;
namespace Volo.Abp.AspNetCore.CorrelationIdProvider;
public class CorrelationIdProvider_Tests : AspNetCoreMvcTestBase
{
[Fact]
public async Task Test()
{
// Test AbpCorrelationIdMiddleware without X-Correlation-Id header
using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, "/api/correlation/404"))
{
var response = await Client.SendAsync(requestMessage);
response.StatusCode.ShouldBe(HttpStatusCode.NotFound);
response.Headers.ShouldContain(x => x.Key == "X-Correlation-Id" && x.Value.First() != null);
}
var correlationId = Guid.NewGuid().ToString("N");
// Test AbpCorrelationIdMiddleware
using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, "/api/correlation/404"))
{
requestMessage.Headers.Add("X-Correlation-Id", correlationId);
var response = await Client.SendAsync(requestMessage);
response.StatusCode.ShouldBe(HttpStatusCode.NotFound);
response.Headers.ShouldContain(x => x.Key == "X-Correlation-Id" && x.Value.First() == correlationId);
}
// Test AspNetCoreCorrelationIdProvider
using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, "/api/correlation/get"))
{
requestMessage.Headers.Add("X-Correlation-Id", correlationId);
var response = await Client.SendAsync(requestMessage);
response.StatusCode.ShouldBe(HttpStatusCode.OK);
(await response.Content.ReadAsStringAsync()).ShouldBe(correlationId);
}
}
}

34
framework/test/Volo.Abp.Core.Tests/Volo/Abp/CorrelationIdProvider/CorrelationIdProvider_Tests.cs

@ -0,0 +1,34 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Modularity;
using Volo.Abp.Tracing;
using Xunit;
namespace Volo.Abp.CorrelationIdProvider;
public class CorrelationIdProvider_Tests
{
[Fact]
public async Task Test()
{
using (var application = await AbpApplicationFactory.CreateAsync<IndependentEmptyModule>())
{
await application.InitializeAsync();
var correlationIdProvider = application.ServiceProvider.GetRequiredService<ICorrelationIdProvider>();
var currentCorrelationId = correlationIdProvider.Get();
currentCorrelationId.ShouldNotBeNull();
var correlationId = Guid.NewGuid().ToString("N");
using (correlationIdProvider.Change(correlationId))
{
correlationIdProvider.Get().ShouldBe(correlationId);
}
//The default correlation id always changes.
correlationIdProvider.Get().ShouldNotBe(currentCorrelationId);
}
}
}
Loading…
Cancel
Save