IWebHostEnvironment - ข้อมูลสภาพแวดล้อมโฮสติ้งเว็บ
IWebHostEnvironment (เนมสเปซ Microsoft.AspNetCore.Hosting) เป็น Service ที่ให้ข้อมูลเกี่ยวกับสภาพแวดล้อมที่แอปพลิเคชันกำลังทำงานอยู่ ใช้ผ่าน Dependency Injection
คุณสมบัติหลัก 2 ตัว
| คุณสมบัติ | คำอธิบาย | ตัวอย่างค่า |
| ContentRootPath | เส้นทางโฟลเดอร์รากของแอป (มี .csproj, appsettings.json, Program.cs) | C:\Projects\MyApp |
| WebRootPath | เส้นทางโฟลเดอร์ wwwroot (ไฟล์ Static: css, js, images) | C:\Projects\MyApp\wwwroot |
| EnvironmentName | ชื่อ Environment (Development, Staging, Production) | Development |
| ApplicationName | ชื่อแอปพลิเคชัน (จาก Assembly) | MyApp |
| ContentRootFileProvider | IFileProvider สำหรับ ContentRoot | - |
| WebRootFileProvider | IFileProvider สำหรับ WebRoot | - |
การใช้งานผ่าน Dependency Injection
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller
{
private readonly IWebHostEnvironment _env;
// Inject ผ่าน Constructor
public HomeController(IWebHostEnvironment env)
{
_env = env;
}
public IActionResult Index()
{
// เข้าถึง Path
string wwwPath = _env.WebRootPath;
string contentPath = _env.ContentRootPath;
string envName = _env.EnvironmentName;
ViewBag.WwwPath = wwwPath;
ViewBag.ContentPath = contentPath;
ViewBag.EnvName = envName;
return View();
}
}
การใช้งานใน Program.cs / Startup.cs
var builder = WebApplication.CreateBuilder(args);
// เข้าถึง Environment ในตอน Build
var env = builder.Environment; // IWebHostEnvironment
if (env.IsDevelopment())
{
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
}
// หรือใช้ EnvironmentName โดยตรง
if (env.EnvironmentName == "Staging")
{
// Staging-specific config
}
var app = builder.Build();
// เข้าถึงใน Middleware
app.Use(async (context, next) =>
{
var env = context.RequestServices.GetRequiredService<IWebHostEnvironment>();
// ใช้ env...
await next();
});
app.Run();
เมธอดช่วยตรวจสอบ Environment
// Extension methods (ใน Microsoft.AspNetCore.Hosting)
_env.IsDevelopment() // true ถ้า ASPNETCORE_ENVIRONMENT=Development
_env.IsStaging() // true ถ้า = Staging
_env.IsProduction() // true ถ้า = Production
_env.IsEnvironment("CustomEnv") // ตรวจสอบชื่อเฉพาะ
การตั้งค่า Environment
| วิธี | ตัวอย่าง | ความสำคัญ |
| Environment Variable | ASPNETCORE_ENVIRONMENT=Development | สูงสุด |
| launchSettings.json | "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } | เฉพาะ Visual Studio / dotnet run |
| Command Line | dotnet run --environment Development | สูง |
| Docker | ENV ASPNETCORE_ENVIRONMENT=Production | Production Standard |
การใช้ IFileProvider (อ่านไฟล์ได้ทั้งในและนอก wwwroot)
public class FileService
{
private readonly IWebHostEnvironment _env;
public FileService(IWebHostEnvironment env)
{
_env = env;
}
public string ReadConfigFile(string fileName)
{
// อ่านจาก ContentRoot (โฟลเดอร์โปรเจกต์)
var fileProvider = _env.ContentRootFileProvider;
var fileInfo = fileProvider.GetFileInfo(fileName);
if (fileInfo.Exists)
{
using var stream = fileInfo.CreateReadStream();
using var reader = new StreamReader(stream);
return reader.ReadToEnd();
}
return null;
}
public string GetImagePath(string imageName)
{
// สร้าง Path ไปยัง wwwroot/images
return Path.Combine(_env.WebRootPath, "images", imageName);
}
}
IWebHostEnvironment vs IHostEnvironment
| Interface | เนมสเปซ | ใช้เมื่อไหร่ |
| IWebHostEnvironment | Microsoft.AspNetCore.Hosting | Web App (Controller, Middleware, Razor Pages) |
| IHostEnvironment | Microsoft.Extensions.Hosting | Generic Host (Worker Service, Console App) |
IWebHostEnvironment สืบทอดมาจาก IHostEnvironment เพิ่ม WebRootPath และ WebRootFileProvider
Best Practices
- ✅ Inject IWebHostEnvironment ผ่าน Constructor (DI)
- ✅ ใช้
Path.Combine สร้าง Path (Cross-platform safe)
- ✅ ใช้
_env.IsDevelopment() แทนการเช็ค string โดยตรง
- ❌ อย่า Hardcode Path เช่น
C:\inetpub\wwwroot
- ❌ อย่าใช้ Directory.GetCurrentDirectory() - ไม่ไว้วางใจได้ใน Production
- ⚠️ WebRootPath อาจเป็น null ถ้าไม่มีโฟลเดอร์ wwwroot - ต้อง Check null
ตัวอย่าง: Serve Static Files จากหลายที่
var app = builder.Build();
// wwwroot (Default)
app.UseStaticFiles();
// อีกโฟลเดอร์หนึ่ง (เช่น uploads ออกนอก wwwroot)
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "uploads")),
RequestPath = "/uploads"
});
app.Run();