在 AWS 无服务器 Lambda 上,使用 .Net Core 3.1 时,如果在代码中使用了 Okta SDK,可能会出现以下错误消息:System.TypeInitializationException: The type initializer for 'System.Net.Http.CurlHandler' threw an exception. 这是因为在 .Net Core 3.1 上,不再使用 curl 库,但 Okta SDK 还在使用它。因此,需要手动设置 Okta SDK 的 HttpClient,以使用 dotnetty-transport 对 curl 库进行兼容处理。
以下是解决方法的代码示例:
在 Startup.cs 中注册 OktaConfiguration:
services.AddSingleton
更改 Okta 的 HttpClient:
public class OktaHttpClientFactory : IOktaHttpClientFactory { private readonly ILogger _logger;
public OktaHttpClientFactory(ILogger logger)
{
_logger = logger;
}
public HttpClient GetHttpClient(IOktaConfiguration configuration)
{
var httpClientHandler = new SocketsHttpHandler()
{
EnableMultipleHttp2Connections = true
};
var httpClient = new HttpClient(httpClientHandler)
{
BaseAddress = new Uri(configuration.BaseUrl),
Timeout = TimeSpan.FromSeconds(30)
};
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", configuration.ApiToken);
return httpClient;
}
}
在 ConfigureServices 方法中,注册 OktaHttpClientFactory:
services.AddSingleton
在使用 Okta SDK 的类中,注入 IOktaHttpClientFactory,并使用它来创建 OktaClient:
public class OktaClientTest { private readonly IOktaHttpClientFactory _httpClientFactory;
public OktaClientTest(IOktaHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task Test()
{
var configuration = new OktaConfiguration()
{
BaseUrl = "https://your-tenant.okta.com",
ApiToken = "your-api-token",
UseClient