Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I get this InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Http.RequestDelegate'?

I've just upgraded my ASP.NET Core WebApi project from .NET Core 2.2 to 3.1.

I've fixed up all of the compile-time errors, upgraded my Nuget packages, and I can now run the app.

However, When I call Build() on my IHostBuilder, I get the following exception:

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Http.RequestDelegate' while attempting to activate 'MyProject.Api.Middleware.ExceptionHandlerMiddleware'.

InvalidOperationException

The Middleware it's referring to is pretty standard.

ExceptionHandlerMiddleware.cs

public class ExceptionHandlerMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<ExceptionHandlerMiddleware> _logger;

    public ExceptionHandlerMiddleware(RequestDelegate next, ILogger<ExceptionHandlerMiddleware> logger)
    {
        _logger = logger;
        _next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        // redacted
    }
}

The rest of my app initialisation is fairly standard and I didn't change much going from 2.2 to 3.1 (2.2 was working).

I did change from services.AddMvc() to services.AddControllers().

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    private static IHostBuilder CreateHostBuilder(string[] args)
    {
        return Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(builder =>
            {
                builder.UseSerilog().UseStartup<Startup>();
            })
            .ConfigureLogging((context, logging) =>
            {
                logging
                .AddConfiguration(context.Configuration.GetSection("Logging"))
                .AddConsole()
                .AddDebug();
            });
    }
}

It's also worth mentioning that the ConfigureServices() method in Startup.cs is being called and runs fine, but Configure() never runs. The Build() method always kills the app before it gets to Configure().

My Startup's Configure method signature looks like this:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
like image 334
Rowan Freeman Avatar asked Dec 23 '19 23:12

Rowan Freeman


Video Answer


1 Answers

I ran into the same problem today and resolved it as follows:

In .net core 2.2 I added the middleware to the application builder and also added the middleware to the service collection. Apparently adding the middleware to the service collection is no longer required and results in the exception you posted.

In my case removing the line

services.AddSingleton<MyMiddleware>();

resolved the issue.

like image 73
user1796440 Avatar answered Oct 20 '22 23:10

user1796440