🐛 Fix http client didn't ignore CA
This commit is contained in:
@@ -25,7 +25,10 @@ public class AccountRewindService(
|
|||||||
var httpClient = httpClientFactory.CreateClient(
|
var httpClient = httpClientFactory.CreateClient(
|
||||||
$"{nameof(AccountRewindService)}+{CapitalizeFirstLetter(serviceId)}"
|
$"{nameof(AccountRewindService)}+{CapitalizeFirstLetter(serviceId)}"
|
||||||
);
|
);
|
||||||
var channel = GrpcChannel.ForAddress($"https://_grpc.{serviceId}", new GrpcChannelOptions { HttpClient = httpClient });
|
var channel = GrpcChannel.ForAddress($"https://_grpc.{serviceId}", new GrpcChannelOptions
|
||||||
|
{
|
||||||
|
HttpClient = httpClient,
|
||||||
|
});
|
||||||
return new RewindService.RewindServiceClient(channel);
|
return new RewindService.RewindServiceClient(channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,127 +24,129 @@ public static class Extensions
|
|||||||
private const string HealthEndpointPath = "/health";
|
private const string HealthEndpointPath = "/health";
|
||||||
private const string AlivenessEndpointPath = "/alive";
|
private const string AlivenessEndpointPath = "/alive";
|
||||||
|
|
||||||
public static TBuilder AddServiceDefaults<TBuilder>(this TBuilder builder)
|
extension<TBuilder>(TBuilder builder) where TBuilder : IHostApplicationBuilder
|
||||||
where TBuilder : IHostApplicationBuilder
|
|
||||||
{
|
{
|
||||||
// Allow unencrypted grpc
|
public TBuilder AddServiceDefaults()
|
||||||
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
|
|
||||||
|
|
||||||
builder.ConfigureOpenTelemetry();
|
|
||||||
|
|
||||||
builder.AddDefaultHealthChecks();
|
|
||||||
|
|
||||||
builder.Services.AddServiceDiscovery();
|
|
||||||
builder.Services.AddServiceDiscoveryCore();
|
|
||||||
|
|
||||||
builder.Services.ConfigureHttpClientDefaults(http =>
|
|
||||||
{
|
{
|
||||||
// Turn on resilience by default
|
// Allow unencrypted grpc
|
||||||
http.AddStandardResilienceHandler();
|
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
|
||||||
|
|
||||||
// Turn on service discovery by default
|
builder.ConfigureOpenTelemetry();
|
||||||
http.AddServiceDiscovery();
|
|
||||||
});
|
|
||||||
|
|
||||||
builder.Services.AddSingleton<IClock>(SystemClock.Instance);
|
builder.AddDefaultHealthChecks();
|
||||||
|
|
||||||
builder.AddNatsClient("Queue");
|
builder.Services.AddServiceDiscovery();
|
||||||
builder.AddRedisClient(
|
builder.Services.AddServiceDiscoveryCore();
|
||||||
"Cache",
|
|
||||||
configureOptions: opts =>
|
builder.Services.ConfigureHttpClientDefaults(http =>
|
||||||
{
|
{
|
||||||
opts.AbortOnConnectFail = false;
|
// Turn on resilience by default
|
||||||
}
|
http.AddStandardResilienceHandler();
|
||||||
);
|
// Turn on service discovery by default
|
||||||
|
http.AddServiceDiscovery();
|
||||||
// Setup cache service
|
// Ignore CA
|
||||||
builder.Services.AddStackExchangeRedisCache(options =>
|
http.ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler
|
||||||
{
|
{
|
||||||
options.Configuration = builder.Configuration.GetConnectionString("Cache");
|
ServerCertificateCustomValidationCallback = (_, _, _, _) => true,
|
||||||
options.InstanceName = "dyson:";
|
});
|
||||||
});
|
|
||||||
builder.Services.AddSingleton<IDistributedLockFactory, RedLockFactory>(sp =>
|
|
||||||
{
|
|
||||||
var mux = sp.GetRequiredService<IConnectionMultiplexer>();
|
|
||||||
return RedLockFactory.Create(new List<RedLockMultiplexer> { new(mux) });
|
|
||||||
});
|
|
||||||
builder.Services.AddSingleton<ICacheService, CacheServiceRedis>();
|
|
||||||
if (builder.Configuration.GetSection("Cache")["Serializer"] == "MessagePack")
|
|
||||||
builder.Services.AddSingleton<ICacheSerializer, MessagePackCacheSerializer>();
|
|
||||||
else
|
|
||||||
builder.Services.AddSingleton<ICacheSerializer, JsonCacheSerializer>();
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TBuilder ConfigureOpenTelemetry<TBuilder>(this TBuilder builder)
|
|
||||||
where TBuilder : IHostApplicationBuilder
|
|
||||||
{
|
|
||||||
builder.Logging.AddOpenTelemetry(logging =>
|
|
||||||
{
|
|
||||||
logging.IncludeFormattedMessage = true;
|
|
||||||
logging.IncludeScopes = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
builder
|
|
||||||
.Services.AddOpenTelemetry()
|
|
||||||
.WithMetrics(metrics =>
|
|
||||||
{
|
|
||||||
metrics
|
|
||||||
.AddAspNetCoreInstrumentation()
|
|
||||||
.AddHttpClientInstrumentation()
|
|
||||||
.AddRuntimeInstrumentation();
|
|
||||||
})
|
|
||||||
.WithTracing(tracing =>
|
|
||||||
{
|
|
||||||
tracing
|
|
||||||
.AddSource(builder.Environment.ApplicationName)
|
|
||||||
.AddAspNetCoreInstrumentation(tracing =>
|
|
||||||
// Exclude health check requests from tracing
|
|
||||||
tracing.Filter = context =>
|
|
||||||
!context.Request.Path.StartsWithSegments(HealthEndpointPath)
|
|
||||||
&& !context.Request.Path.StartsWithSegments(AlivenessEndpointPath)
|
|
||||||
)
|
|
||||||
.AddGrpcClientInstrumentation()
|
|
||||||
.AddHttpClientInstrumentation();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.AddOpenTelemetryExporters();
|
builder.Services.AddSingleton<IClock>(SystemClock.Instance);
|
||||||
|
|
||||||
return builder;
|
builder.AddNatsClient("Queue");
|
||||||
}
|
builder.AddRedisClient(
|
||||||
|
"Cache",
|
||||||
|
configureOptions: opts =>
|
||||||
|
{
|
||||||
|
opts.AbortOnConnectFail = false;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
private static TBuilder AddOpenTelemetryExporters<TBuilder>(this TBuilder builder)
|
// Setup cache service
|
||||||
where TBuilder : IHostApplicationBuilder
|
builder.Services.AddStackExchangeRedisCache(options =>
|
||||||
{
|
{
|
||||||
var useOtlpExporter = !string.IsNullOrWhiteSpace(
|
options.Configuration = builder.Configuration.GetConnectionString("Cache");
|
||||||
builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]
|
});
|
||||||
);
|
builder.Services.AddSingleton<IDistributedLockFactory, RedLockFactory>(sp =>
|
||||||
|
{
|
||||||
|
var mux = sp.GetRequiredService<IConnectionMultiplexer>();
|
||||||
|
return RedLockFactory.Create(new List<RedLockMultiplexer> { new(mux) });
|
||||||
|
});
|
||||||
|
builder.Services.AddSingleton<ICacheService, CacheServiceRedis>();
|
||||||
|
if (builder.Configuration.GetSection("Cache")["Serializer"] == "MessagePack")
|
||||||
|
builder.Services.AddSingleton<ICacheSerializer, MessagePackCacheSerializer>();
|
||||||
|
else
|
||||||
|
builder.Services.AddSingleton<ICacheSerializer, JsonCacheSerializer>();
|
||||||
|
|
||||||
if (useOtlpExporter)
|
return builder;
|
||||||
{
|
|
||||||
builder.Services.AddOpenTelemetry().UseOtlpExporter();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.AspNetCore package)
|
public TBuilder ConfigureOpenTelemetry()
|
||||||
//if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
|
{
|
||||||
//{
|
builder.Logging.AddOpenTelemetry(logging =>
|
||||||
// builder.Services.AddOpenTelemetry()
|
{
|
||||||
// .UseAzureMonitor();
|
logging.IncludeFormattedMessage = true;
|
||||||
//}
|
logging.IncludeScopes = true;
|
||||||
|
});
|
||||||
|
|
||||||
return builder;
|
builder
|
||||||
}
|
.Services.AddOpenTelemetry()
|
||||||
|
.WithMetrics(metrics =>
|
||||||
|
{
|
||||||
|
metrics
|
||||||
|
.AddAspNetCoreInstrumentation()
|
||||||
|
.AddHttpClientInstrumentation()
|
||||||
|
.AddRuntimeInstrumentation();
|
||||||
|
})
|
||||||
|
.WithTracing(tracing =>
|
||||||
|
{
|
||||||
|
tracing
|
||||||
|
.AddSource(builder.Environment.ApplicationName)
|
||||||
|
.AddAspNetCoreInstrumentation(tracing =>
|
||||||
|
// Exclude health check requests from tracing
|
||||||
|
tracing.Filter = context =>
|
||||||
|
!context.Request.Path.StartsWithSegments(HealthEndpointPath)
|
||||||
|
&& !context.Request.Path.StartsWithSegments(AlivenessEndpointPath)
|
||||||
|
)
|
||||||
|
.AddGrpcClientInstrumentation()
|
||||||
|
.AddHttpClientInstrumentation();
|
||||||
|
});
|
||||||
|
|
||||||
public static TBuilder AddDefaultHealthChecks<TBuilder>(this TBuilder builder)
|
builder.AddOpenTelemetryExporters();
|
||||||
where TBuilder : IHostApplicationBuilder
|
|
||||||
{
|
|
||||||
builder
|
|
||||||
.Services.AddHealthChecks()
|
|
||||||
// Add a default liveness check to ensure app is responsive
|
|
||||||
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
|
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TBuilder AddOpenTelemetryExporters()
|
||||||
|
{
|
||||||
|
var useOtlpExporter = !string.IsNullOrWhiteSpace(
|
||||||
|
builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]
|
||||||
|
);
|
||||||
|
|
||||||
|
if (useOtlpExporter)
|
||||||
|
{
|
||||||
|
builder.Services.AddOpenTelemetry().UseOtlpExporter();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.AspNetCore package)
|
||||||
|
//if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
|
||||||
|
//{
|
||||||
|
// builder.Services.AddOpenTelemetry()
|
||||||
|
// .UseAzureMonitor();
|
||||||
|
//}
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TBuilder AddDefaultHealthChecks()
|
||||||
|
{
|
||||||
|
builder
|
||||||
|
.Services.AddHealthChecks()
|
||||||
|
// Add a default liveness check to ensure app is responsive
|
||||||
|
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static WebApplication MapDefaultEndpoints(this WebApplication app)
|
public static WebApplication MapDefaultEndpoints(this WebApplication app)
|
||||||
|
|||||||
@@ -78,6 +78,7 @@
|
|||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIDatabaseAsync_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003F93b441a9e8201c5bdfa1b1fdc8061a77b86ccbb8566d7bae85036aba8c618f7_003FIDatabaseAsync_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIDatabaseAsync_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003F93b441a9e8201c5bdfa1b1fdc8061a77b86ccbb8566d7bae85036aba8c618f7_003FIDatabaseAsync_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIEtcdClient_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F866376757aa64634b820c41d3553727886400_003Fbb_003F0fd3f8d7_003FIEtcdClient_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIEtcdClient_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F866376757aa64634b820c41d3553727886400_003Fbb_003F0fd3f8d7_003FIEtcdClient_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIHtmlString_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F95cd5fa21c574d4087dec626d8227d77be00_003Ff1_003F3a8957fa_003FIHtmlString_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIHtmlString_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F95cd5fa21c574d4087dec626d8227d77be00_003Ff1_003F3a8957fa_003FIHtmlString_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIHttpClientFactory_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F9abe32e003f64c00b5d3be5e7a00bd0b34738_003F97_003Fd50a6d62_003FIHttpClientFactory_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIHttpForwarder_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fbf3f51607a3e4e76b5b91640cd7409195c430_003F29_003F7eee2eb9_003FIHttpForwarder_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIHttpForwarder_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fbf3f51607a3e4e76b5b91640cd7409195c430_003F29_003F7eee2eb9_003FIHttpForwarder_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AImageFile_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa932cb9090ed48088111ae919dcdd9021ba00_003F71_003F0a804432_003FImageFile_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AImageFile_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa932cb9090ed48088111ae919dcdd9021ba00_003F71_003F0a804432_003FImageFile_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AImage_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5aa524c330cf4033930e4a8661c62bc331a00_003F24_003Fdb8cbeea_003FImage_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AImage_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5aa524c330cf4033930e4a8661c62bc331a00_003F24_003Fdb8cbeea_003FImage_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
|||||||
Reference in New Issue
Block a user