Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET Core Web API, How can I access HttpContext in startup class

I'm trying to access HttpContext to get RemoteIpAddress and User-Agent, but within Startup.cs.

 public class Startup
        {
            public Startup(IConfiguration configuration, IHttpContextAccessor httpContextAccessor)
            {
                Configuration = configuration;
                _httpContextAccessor = httpContextAccessor;
            }

            public IConfiguration Configuration { get; }
            public IHttpContextAccessor _httpContextAccessor { get; }

            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                IdentityModelEventSource.ShowPII = true;

                var key = Encoding.ASCII.GetBytes(Configuration.GetValue<string>("claveEncriptacion"));
                var ip = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
                var userAgent = _httpContextAccessor.HttpContext.Request.Headers["User-Agent"].ToString();

services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(x =>
            {
                //x.Audience = ip + "-" + userAgent;
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = true
                };
            });

With the previous code I have an error executing the project.

Unable to resolve service for type 'Microsoft.AspNetCore.Http.IHttpContextAccessor' while attempting to activate 'JobSiteMentorCore.Startup'.'
like image 314
vidgarga Avatar asked Oct 21 '25 07:10

vidgarga


1 Answers

According to the ASP.NET Core documentation , only the following service types can be injected into the Startup constructor when using the Generic Host (IHostBuilder):

IWebHostEnvironment
IHostEnvironment
IConfiguration

So you cannot inject IHttpContextAccessor to Startup constructor.

However you can get DI resolved service in ConfigureServices method of the Startup class as follows:

public void ConfigureServices(IServiceCollection services)
{

    services.AddScoped<IYourService, YourService>();

    // Build an intermediate service provider
    var serviceProvider = services.BuildServiceProvider();

    // Resolve the services from the service provider
    var yourService = serviceProvider.GetService<IYourService>();

}

But you can not get the HttpContext using IHttpContextAccessor similarly because HttpContext is null unless the code executed during any HttpRequest. So you have to do your desired operation from any custom middleware in Configure method of the Startup class as follows:

public class YourCustomMiddleMiddleware
{
    private readonly RequestDelegate _requestDelegate;

    public YourCustomMiddleMiddleware(RequestDelegate requestDelegate)
    {
        _requestDelegate = requestDelegate;
    }

    public async Task Invoke(HttpContext context)
    {

      // Your HttpContext related task is in here.

      await _requestDelegate(context);
    }
}

Then in the Configure method of the Startup class as follows:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   app.UseMiddleware(typeof(YourCustomMiddleMiddleware));
}
like image 134
TanvirArjel Avatar answered Oct 22 '25 23:10

TanvirArjel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!