Microsoft.Extensions.DependencyInjection.dll 中发生类型为“System.AggregateException”的未处理异常:

san*_*tro 3 c# dependency-injection c#-8.0 graphql.net asp.net-core-3.1

我将一个asp.net core项目从2.2版本迁移到3.1版本。我已经添加了所有依赖项和 docker 相关组件。它编译正常,但在运行项目时我收到以下错误:

抛出异常:Microsoft.Extensions.DependencyInjection.dll 中的“System.AggregateException” Microsoft.Extensions.DependencyInjection.dll 中发生类型“System.AggregateException”的未处理异常:“无法构造某些服务”堆栈跟踪:位于Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable 1 serviceDescriptors, ServiceProviderOptions options) at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options) at Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection containerBuilder) at Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter1.CreateServiceProvider(对象containerBuilder)在Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()在Microsoft.Extensions.Hosting.HostBuilder.Build()在Sample.API.Program。 /src/QueryStack/Sample.API/Program.cs 中的 Main(String[] args):第 20 行 程序“kubectl.exe”已退出,代码为 -1 (0xffffffff)。

这是我的代码:

程序.cs

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace Sample.API
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Use the W3C Trace Context format to propagate distributed trace identifiers.
            // See https://devblogs.microsoft.com/aspnet/improvements-in-net-core-3-0-for-troubleshooting-and-monitoring-distributed-apps/
            Activity.DefaultIdFormat = ActivityIdFormat.W3C;
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) => 
            Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseKestrel(options => options.AddServerHeader = false);
                webBuilder.UseStartup<Startup>();
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

启动.cs

using Sample.API.Constants;
using Sample.API.Extensions;
using Sample.API.GraphQL;
using Sample.API.Middleware;
using Boxed.AspNetCore;
using GraphQL.Server;
using GraphQL.Server.Ui.Playground;
using GraphQL.Server.Ui.Voyager;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Sample.API
{
    public class Startup
    {
        private readonly IConfiguration configuration;
        private readonly IWebHostEnvironment webHostEnvironment;
        /// <summary>
        /// Initializes a new instance of the <see cref = "Startup"/> class.
        /// </summary>
        /// <param name = "configuration">The application configuration, where key value pair settings are stored. See
        /// http://docs.asp.net/en/latest/fundamentals/configuration.html</param>
        /// <param name = "webHostEnvironment">The environment the application is running under. This can be Development,
        /// Staging or Production by default. See http://docs.asp.net/en/latest/fundamentals/environments.html</param>
        public Startup(IConfiguration configuration, IWebHostEnvironment webHostEnvironment)
        {
            this.configuration = configuration;
            this.webHostEnvironment = webHostEnvironment;
        }

        /// <summary>
        /// Configures the services to add to the ASP.NET Core Injection of Control (IoC) container. This method gets
        /// called by the ASP.NET runtime. See
        /// http://blogs.msdn.com/b/webdev/archive/2014/06/17/dependency-injection-in-asp-net-vnext.aspx
        /// </summary>
        public virtual void ConfigureServices(IServiceCollection services) => 
            services
            .AddCosmosDBConfiguration(configuration)
            .AddAutoMapperConfiguration()
            .AddCustomResponseCompression(configuration)
            .AddCustomCors()
            .AddCustomOptions(configuration)
            .AddHttpContextAccessor()
            .AddCustomRouting()
            .AddCustomStrictTransportSecurity()
            .AddCustomHealthChecks()
            .AddServerTiming()
            .AddControllers()
               .AddCustomJsonOptions(webHostEnvironment)
               .AddCustomMvcOptions(configuration)
            .Services
            .AddCustomGraphQL(configuration, webHostEnvironment)
            .AddGraphQLResolvers()
            .AddGraphQLResponse()
            .AddProjectRepositories()
            .AddProjectSchemas();

        /// <summary>
        /// Configures the application and HTTP request pipeline. Configure is called after ConfigureServices is
        /// called by the ASP.NET runtime.
        /// </summary>
        public virtual void Configure(IApplicationBuilder application) =>
            application
                .UseIf(
                    this.webHostEnvironment.IsDevelopment(),
                    x => x.UseServerTiming())
            .UseForwardedHeaders()
            .UseResponseCompression()
            .UseFetchLocaleMiddleware()
            .UseIf(
                    !this.webHostEnvironment.IsDevelopment(),
                    x => x.UseHsts())
                .UseIf(
                    this.webHostEnvironment.IsDevelopment(),
                    x => x.UseDeveloperExceptionPage())
            .UseRouting()
                .UseCors(CorsPolicyName.AllowAny)
            .UseEndpoints(
                    builder =>
                    {
                        builder
                            .MapHealthChecks("/status")
                            .RequireCors(CorsPolicyName.AllowAny);
                        builder
                            .MapHealthChecks("/status/self", new HealthCheckOptions() { Predicate = _ => false })
                            .RequireCors(CorsPolicyName.AllowAny);
                    })
            .UseWebSockets()
                // Use the GraphQL subscriptions in the specified schema and make them available at /graphql.
                .UseGraphQLWebSockets<MainSchema>()
                // Use the specified GraphQL schema and make them available at /graphql.
                .UseGraphQL<MainSchema>()
                .UseIf(
                    this.webHostEnvironment.IsDevelopment(),
                    x => x
                        // Add the GraphQL Playground UI to try out the GraphQL API at /.
                        .UseGraphQLPlayground(new GraphQLPlaygroundOptions() { Path = "/" })
                        // Add the GraphQL Voyager UI to let you navigate your GraphQL API as a spider graph at /voyager.
                        .UseGraphQLVoyager(new GraphQLVoyagerOptions() { Path = "/voyager" }));
    }
}
Run Code Online (Sandbox Code Playgroud)

我遵循了以下提到的模板指南: https: //github.com/Dotnet-Boxed/Templates/blob/master/Docs/GraphQL.md

基于上面的内容,我创建了一个 POC,它工作正常,但不是上面提到的代码。

任何人都可以通过提供指导来帮助我解决这个问题

ede*_*ter 13

一般来说:

  • 在 Visual Studio 中,在“异常设置”窗口中勾选“中断所有 CLR 异常”
  • 现在它会向您显示线路以及具体哪个服务失败

因此,当从哪个服务调用时,哪个服务失败就变得很清楚了,例如

  • 忘记一个“我”
  • 忘记将IOptions<>or放在IOptionsMonitor<>选项参数之前
  • ETC

  • +1 这个建议帮助我确定了我的问题 - 谢谢。对于以前没有使用过异常设置窗口的人,您可以在“调试 &gt; 窗口 &gt; 异常设置”下找到它 (9认同)