Search code examples
c#asp.net-coredependency-injectionstartupconfigure

ASP>NET Core 2.1 : New class instance inside app.Map


I have a middleware to fetch HTTP-requests that begin with "proxycall", and only those. I thought I could call the middleware inside an app.map in startup.config, but the problem is that I don't know how to instantiate it.

Here are my Program file:

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

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)                
        .UseStartup<Startup>()
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
        })
    .UseNLog();

Here are my Startup file:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {            
        string connectionString =
            Configuration.GetConnectionString("DefaultConnection");
        services.AddDbContext<GotMapContext>(o => o.UseSqlServer(connectionString));
        services.AddSingleton<ConfigHelper>(c => new ConfigHelper(Configuration));
        services.Configure<GeoProxyConfig>(Configuration.GetSection("AppSettings"));
        services.AddHttpClient();
        services.AddAutoMapper(); 
        services.AddMvc()
            .AddJsonOptions(o => o.SerializerSettings.ContractResolver = 
                new DefaultContractResolver());                 
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

    app.UseDeveloperExceptionPage();
    app.UseStatusCodePages();
    app.UseStaticFiles();
    app.Map(new PathString("/proxycall"), 
        a => a.Run(async(context ) => 
        {
            // TODO : Create an new instance of GeoProxyMiddleware. 
            // The class requires the config, httpclient and logger instance.
        }));
    app.UseMvcWithDefaultRoute();
}

Here are my middleware that I try to call from app.map:

public class GeoProxyMiddleware
{
    private readonly IOptions<GeoProxyConfig> _geoProxyConfig;
    private readonly IHttpClientFactory _httpClientFactory;
    private readonly ILogger<GeoProxyMiddleware> _logger;

    public GeoProxyMiddleware(
        IOptions<GeoProxyConfig> config, 
        IHttpClientFactory HttpClientFactory, 
        ILogger<GeoProxyMiddleware> logger)
    {
        _geoProxyConfig = config;
        _httpClientFactory = HttpClientFactory;
        _logger = logger;
    }
}

Solution

  • I found a answer to my question in this link: https://www.devtrends.co.uk/blog/conditional-middleware-based-on-request-in-asp.net-core

    app.MapWhen(context => context.Request.Path.StartsWithSegments("/proxycall"), 
               appBuilder => {
                    appBuilder.UseMiddleware<GeoProxyMiddleware>();
               });