হ্যালো হাসিব! তুমি এখন Section 13: Environments-এর দ্বিতীয় লেকচার “Environment in Launch Settings” (Lecture 144)-এ আছো।

আগের লেকচারে আমরা Environment-এর বেসিক থিওরি জেনেছিলাম। আজকের লেকচারে আমরা প্র্যাকটিক্যালি দেখবো ভিজ্যুয়াল স্টুডিওতে কীভাবে launchSettings.json ফাইলের মাধ্যমে Environment সেট করতে হয় এবং Program.cs ফাইলে সেই Environment চেক করে কীভাবে Developer Exception Page অন বা অফ করতে হয়।

চলো, পুরো লেকচারটি বিস্তারিতভাবে ডিকোড করি।


সারসংক্ষেপ (Quick Revision List)

  • Set Environment: ASP.NET Core প্রোজেক্টে লোকাল ডেভেলপমেন্টের সময় Environment সেট করা হয় Properties/launchSettings.json ফাইলে ASPNETCORE_ENVIRONMENT ভ্যারিয়েবল ব্যবহার করে।
  • Read Environment: Program.cs ফাইলে app.Environment.IsDevelopment() বা IsStaging() মেথড ব্যবহার করে কারেন্ট Environment চেক করা যায়।
  • Custom Environment: বিল্ট-ইন ৩টি Environment ছাড়াও app.Environment.IsEnvironment("CustomName") ব্যবহার করে যেকোনো কাস্টম Environment চেক করা যায়।
  • The Main Benefit: Environment চেক করার সবচেয়ে বড় সুবিধা হলো— Development-এ ডিটেইলড এরর (Exception) পেজ দেখানো যায়, কিন্তু Production-এ তা হাইড করে রাখা যায়।

Comprehensive Breakdown

১. launchSettings.json ফাইলে Environment সেট করা [Priority: 10/10]

যখন তুমি ভিজ্যুয়াল স্টুডিও দিয়ে একটি ASP.NET Core প্রোজেক্ট তৈরি করো, তখন Properties ফোল্ডারের ভেতরে launchSettings.json নামে একটি ফাইল অটোমেটিক তৈরি হয়। এই ফাইলে তোমার প্রোজেক্ট রান করার বিভিন্ন প্রোফাইল (যেমন: IIS Express বা Kestrel) থাকে।

এই ফাইলের ভেতরেই environmentVariables সেকশনে আমরা আমাদের Environment সেট করি।

Code Implementation (Properties/launchSettings.json):

"profiles": {
  "EnvironmentsExample": {
    "commandName": "Project",
    "dotnetRunMessages": true,
    "launchBrowser": true,
    "applicationUrl": "http://localhost:5000",
    "environmentVariables": {
      // এখানেই আমরা Environment সেট করি
      "ASPNETCORE_ENVIRONMENT": "Development" // বা "Staging", "Production"
    }
  }
}
 

২. Program.cs ফাইলে Environment চেক করা [Priority: 10/10]

অ্যাপ্লিকেশন রান হওয়ার সময় Program.cs ফাইলে আমরা চেক করি যে এটি কোন Environment-এ চলছে। এর জন্য app.Environment প্রপার্টি ব্যবহার করা হয় (যার টাইপ হলো IWebHostEnvironment)।

Code Implementation (Program.cs):

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
 
var app = builder.Build();
 
// ১. Environment চেক করা হচ্ছে
if (app.Environment.IsDevelopment())
{
    // ২. যদি Development হয়, তবে ডিটেইলড এরর পেজ (Developer Exception Page) অন হবে
    app.UseDeveloperExceptionPage();
}
else
{
    // Production বা Staging হলে ইউজার-ফ্রেন্ডলি এরর পেজ দেখাবে
    app.UseExceptionHandler("/Home/Error");
}
 
app.UseStaticFiles();
app.UseRouting();
app.MapControllers();
 
app.Run();
 

৩. The Magic of UseDeveloperExceptionPage() [Priority: 10/10]

লেকচারার ইচ্ছা করে একটি এরর তৈরি করেছেন (একই রাউট দুটি Action Method-এ দিয়ে)।

  • When Environment = Staging: তুমি যদি launchSettings.json এ Environment-এর নাম “Staging” বা “Production” দাও এবং ব্রাউজারে রিফ্রেশ দাও, দেখবে ব্রাউজারে ব্ল্যাঙ্ক (Blank) পেজ বা শুধু HTTP 500 Internal Server Error দেখাচ্ছে। কোডের কোনো ডিটেইলস নেই। (এটি হ্যাকারদের থেকে কোড হাইড করে)।
  • When Environment = Development: তুমি যদি Environment-এর নাম “Development” দাও, তখন স্ক্রিনে একটি বিশাল হলুদ-সাদা রঙের পেজ আসবে। সেখানে লেখা থাকবে এররটি কেন হয়েছে (যেমন: AmbiguousMatchException), কোন ফাইলের কত নম্বর লাইনে হয়েছে, রিকোয়েস্টের হেডার কী ছিল ইত্যাদি। এটি ডেভেলপারদের ডিবাগ (Debug) করার জন্য অসাধারণ একটি টুল।

৪. Custom Environments চেক করা [Priority: 7/10]

ধরো তুমি launchSettings.json-এ Environment-এর নাম দিয়েছো "Beta"। যেহেতু IsBeta() নামে কোনো বিল্ট-ইন মেথড নেই, তাই তোমাকে IsEnvironment() মেথড ব্যবহার করতে হবে।

Code Implementation:

if (app.Environment.IsEnvironment("Beta"))
{
    // Beta Environment-এর জন্য স্পেসিফিক লজিক
}
 

৫. IWebHostEnvironment-এর অন্যান্য প্রপার্টি [Priority: 6/10]

app.Environment (যার টাইপ IWebHostEnvironment) থেকে আমরা শুধু Environment-এর নামই পাই না, আরও কিছু দরকারি তথ্যও পাই:

  • app.Environment.EnvironmentName: এটি বর্তমান Environment-এর নামটি স্ট্রিং আকারে রিটার্ন করে (যেমন: “Development”)।
  • app.Environment.ContentRootPath: এটি তোমার প্রোজেক্ট ফোল্ডারের রুট পাথ (যে ফোল্ডারে Program.cs আছে) রিটার্ন করে।

VS / VS Code Shortcuts

  • Network Tab Open: ব্রাউজারে Ctrl + Shift + I (বা F12) চাপলে Developer Tools ওপেন হয়। নেটওয়ার্ক (Network) ট্যাবে গেলে তুমি দেখতে পাবে রিকোয়েস্টের স্ট্যাটাস কোড (যেমন 500 বা 200) কী আসছে।

Best Practices & .NET 10 Context

Best Practices for Launch Settings:

  1. Do not commit production secrets in launchSettings.json: এই ফাইলটি শুধু লোকাল ডেভেলপমেন্টের জন্য। প্রোডাকশন সার্ভারে এই ফাইলের কোনো ভ্যালু থাকে না। তাই প্রোডাকশন ডাটাবেসের পাসওয়ার্ড এখানে সেভ করবে না।
  2. ASPNETCORE_ vs DOTNET_: লেকচারার বলেছেন, DOTNET_ENVIRONMENT এবং ASPNETCORE_ENVIRONMENT দুটির যেকোনো একটি ব্যবহার করা যায়। তবে ASP.NET Core ওয়েব অ্যাপ্লিকেশনের জন্য সবসময় ASPNETCORE_ENVIRONMENT ব্যবহার করবে। যদি দুটিই থাকে, তবে ASPNETCORE_ENVIRONMENT আগেরটিকে ওভাররাইড (Override) করবে।

.NET 10 Context: ASP.NET Core 10-এ Environment চেক করা এবং launchSettings.json-এর মেকানিজম .NET Core এর শুরু থেকেই ১০০% সেম এবং অপরিবর্তিত আছে।

তবে .NET 8/10-এ তুমি যদি WebApplication.CreateBuilder(args) কল করো, ফ্রেমওয়ার্ক নিজে থেকেই Development Environment-এর জন্য UseDeveloperExceptionPage() কল করে নেয়। তাই অনেক সময় তোমাকে ম্যানুয়ালি if (app.Environment.IsDevelopment()) লিখে এটি কল করতে হয় না। তবুও ক্লিন কোড এবং কাস্টমাইজেশনের জন্য ম্যানুয়ালি লেখাটাই ভালো প্র্যাকটিস।

হাসিব, launchSettings.json দিয়ে Environment সেট করার কনসেপ্ট কি ক্লিয়ার হয়েছে? রেডি থাকলে আমরা নেক্সট লেকচার “Environment in Controller”-এ মুভ করতে পারি, যেখানে আমরা দেখবো Controller-এর ভেতরে কীভাবে Environment চেক করতে হয়!