In Asp.Net Core if a custom piece of middleware is created and placed in it's own class how does one get access to IHostingEnvironment
from inside the middleware?
For example in my class below I thought I could inject IHostingEnvironment
into the contstructor but it's always null. Any other ideas on how to get access to IHostingEnvironment
?
public class ForceHttps {
private readonly RequestDelegate _next;
private readonly IHostingEnvironment _env;
/// <summary>
/// This approach to getting access to IHostingEnvironment
/// doesn't work. It's always null
/// </summary>
/// <param name="next"></param>
/// <param name="env"></param>
public ForceHttps(RequestDelegate next, IHostingEnvironment env) {
_next = next;
}
public async Task Invoke(HttpContext context) {
string sslPort = "";
HttpRequest request = context.Request;
if(_env.IsDevelopment()) {
sslPort = ":44376";
}
if(request.IsHttps == false) {
context.Response.Redirect("https://" + request.Host + sslPort + request.Path);
}
await _next.Invoke(context);
}
}
You can easily access it in ConfigureServices, just persist it to a property during Startup method which is called first and gets it passed in, then you can access the property from ConfigureServices. public Startup(IWebHostEnvironment env, IApplicationEnvironment appEnv) { ... your code here...
ContentRootPath – Path of the root folder which contains all the Application files. You will need to import the following namespace. In the below example, the IHostingEnvironment is injected in the Controller and assigned to the private property Environment and later used to get the WebRootPath and ContentRootPath.
Now, we need to add our custom middleware in the request pipeline by using Use extension method as shown below. We can add middleware using app. UseMiddleware<MyMiddleware>() method of IApplicationBuilder also. Thus, we can add custom middleware in the ASP.NET Core application.
How do you check if current environment is development or not? If you need to check whether the application is running in a particular environment, use env. IsEnvironment("environmentname") since it will correctly ignore case (instead of checking if env. EnvironmentName == "Development" for example).
method injection works, just add it to the method signature
public async Task Invoke(HttpContext context, IHostingEnvironment env) {...}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With