如何处理 IHostBuilder CreateHostBuilder 的异常

Posted

技术标签:

【中文标题】如何处理 IHostBuilder CreateHostBuilder 的异常【英文标题】:how to handle exception for IHostBuilder CreateHostBuilder 【发布时间】:2020-07-22 14:50:23 【问题描述】:

为了模拟错误,我提供了错误的 azure key vault 地址。使用以下代码;我尝试了所有可能的方法来尝试/捕获异常,但在应用启动时仍然出现错误。

如何处理此异常,以使应用程序在启动期间不会抛出错误?

我有 ASP.NET Core 3.1 Web API 应用程序。

HTTP 错误 500.30 - ANCM 进程中启动失败

错误的实际原因是我放错了key vault地址,

System.Net.Http.HttpRequestException: '没有这样的主机是已知的。'

 public class Program

    public static void Main(string[] args)
    
        try
        
            CreateHostBuilder(args).Build().Run();
        
        catch (Exception exception)
        
            Console.WriteLine(exception);
        
    

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)

           .ConfigureAppConfiguration((context, config) =>
            
                try
                
                    var keyVaultClient = KeyVaultClient();
                    if (keyVaultClient != null)
                        config.AddAzureKeyVault("https://testkeyvault07021.vault.azure.net", keyVaultClient,
                            new DefaultKeyVaultSecretManager());
                
                catch (Exception exception)
                
                    Console.WriteLine(exception);
                

            )

            .ConfigureWebHostDefaults(webBuilder =>
            
                webBuilder.UseStartup<Startup>();
            );

    private static KeyVaultClient KeyVaultClient()
    
        try
        
            var azureServiceTokenProvider = new AzureServiceTokenProvider();
            var keyVaultClient =
                new KeyVaultClient(
                    new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
            return keyVaultClient;
        
        catch (Exception exception)
        
            Console.WriteLine(exception);
            return null;
        
    

【问题讨论】:

尽管您可能会发现这样的错误,但手动更正地址然后确保处理基本操作的缓存、托管身份、不正确的令牌等不是更好。看起来像一个花费大量精力来捕获应为应用程序安全边界定义的地址,而无需进行太多更改。 @Greg,感谢您的评论,这只是我模拟的一件事,但也可能是其他原因,例如未配置托管身份、未设置天蓝色秘密权限等崩溃了。你是说我们不能处理字幕吗? 我必须深入挖掘,但对中间件将运行的每个请求一目了然。因此,您可能会在管道中进行一些强大的错误处理,这将在层次结构中运行得相当高,这可能会阻碍静态地址的性能。另外,您为什么使用通用主机构建器与网络主机构建器? docs.microsoft.com/en-us/aspnet/core/fundamentals/host/… 谢谢@Greg,我使用的是通用主机,默认带有 asp.net core 3.1 【参考方案1】:

该应用程序实际上运行良好,我认为没有任何确切的方法可以解决这种情况。 当您启动应用程序时,程序类的工作是配置宿主环境,包括设置服务器,然后调用 Startup 类完成应用程序的配置。

Startup 类负责创建处理 HTTP 请求的管道。这意味着如果在配置 Startup 类之前发生任何错误,服务器将不知道如何处理错误或如何处理错误,因此您会得到 HTTP 500,

如果必须在调用 Startup 类并使用 Configure 方法配置 HTTP 管道后处理错误,并且您已包含 app.UseDeveloperExceptionPage(); 那么正确的错误信息就会被打印回来。

生成错误是因为您在构建 API 时向 API 发出了 HTTP 请求

【讨论】:

以上是关于如何处理 IHostBuilder CreateHostBuilder 的异常的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 MaxUploadSizeExceededException

如何处理 UsernameNotFoundException 春季安全

如何处理c#中的错误代码

Akka 如何处理消息版本?

开玩笑测试 - 如何处理 JsonWebToken 响应

如何处理 JSON 响应