عنوان:

‫بررسی جامع خطای 404 بعد از ارتقاء به Visual Studio 2022


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۲/۱۷ ۰۷:۲۲
آدرس: www.dntips.ir
خطای 404 که ممکن است بعد از ارتقاء به Visual Studio 2022 در یک برنامه‌ی ASP.NET Core مشاهده شود، نشان می‌دهد که درخواست به مسیر https://localhost:5001/ ارسال شده، اما هیچ کنترلر، اکشن یا فایل استاتیکی برای این مسیر پیدا نشده و درخواست به انتهای پایپ‌لاین middleware رسیده، بدون اینکه توسط کد برنامه مدیریت شود. این مشکل ممکن است به دلایل مختلفی پس از آپدیت ویژوال استودیو رخ داده باشد. در ادامه دلایل احتمالی و راه‌حل‌های ممکن را بررسی می‌کنیم:

دلایل احتمالی
تغییرات در تنظیمات پروژه یا Launch Settings:
  • آپدیت ویژوال استودیو ممکن است تنظیمات فایل launchSettings.json یا پیکربندی‌های مربوط به پروفایل اجرا (مانند IIS Express یا Kestrel) را تغییر داده باشد.
  • ممکن است پورت یا URL پیش‌فرض تغییر کرده و با تنظیمات برنامه همخوانی نداشته باشد.

مشکل در پیکربندی Routing:
  • اگر برنامه از کنترلرها یا Minimal API استفاده می‌کند، ممکن است تعریف مسیرها (routes) به درستی انجام نشده باشد یا بعد از آپدیت، ترتیب middleware‌ها تغییر کرده باشد.
  • به عنوان مثال، عدم وجود مسیر پیش‌فرض (default route) یا عدم فراخوانی app.MapControllers() می‌تواند باعث این خطا شود.

مشکل در فایل‌های استاتیک یا wwwroot:
  • اگر برنامه به فایل‌های استاتیک (مانند index.html یا index.cshtml) وابسته است، ممکن است تنظیمات مربوط به UseStaticFiles یا مسیر wwwroot به درستی کار نکند.
  • آپدیت ممکن است باعث تغییراتی در نحوه مدیریت فایل‌های استاتیک شده باشد.

مشکلات مربوط به Kestrel یا IIS Express:
  • ممکن است تنظیمات Kestrel (وب‌سرور داخلی ASP.NET Core) یا IIS Express پس از آپدیت تغییر کرده باشد، مثلاً پورت‌های HTTP/HTTPS به درستی تنظیم نشده باشند.
  • عدم وجود UseHttpsRedirection یا مشکلات مربوط به گواهی SSL می‌تواند باعث خطا شود (نصب مجدد مجوزهای آزمایشی SSL توصیه می‌شود).

کش ویژوال استودیو یا فایل‌های موقت:
  • آپدیت ممکن است باعث ایجاد ناسازگاری در فایل‌های کش ویژوال استودیو یا پوشه‌های موقتی مانند bin و obj شده باشد.

تغییرات در Program.cs یا Middleware Pipeline:
  • اگر از Minimal API یا ساختار جدید ASP.NET Core (بدون Startup.cs) استفاده می‌کنید، ممکن است ترتیب یا تنظیمات middleware‌ها به درستی پیکربندی نشده باشد.

راه‌حل‌های پیشنهادی
برای رفع این مشکل، مراحل زیر را به ترتیب امتحان کنید:

1. بررسی تنظیمات LaunchSettings.json
فایل Properties/launchSettings.json را باز کنید و مطمئن شوید که تنظیمات پورت و URL با آنچه در خروجی خطا (مثلاً https://localhost:5001) دیده می‌شود، همخوانی دارد. یک نمونه تنظیمات به این شکل است:
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5000",
      "sslPort": 5001
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "YourAppName": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
  • مطمئن شوید که applicationUrl و sslPort با پورت‌های مورد استفاده (5000 برای HTTP و 5001 برای HTTPS) مطابقت دارند.
  • اگر از Kestrel استفاده می‌کنید، پروفایل مربوط به "commandName": "Project" را بررسی کنید.

2. بررسی فایل Program.cs
فایل Program.cs را بررسی کنید تا مطمئن شوید که middleware‌ها و مسیرها به درستی تنظیم شده‌اند. یک نمونه کد برای یک برنامه MVC به این شکل است:
var builder = WebApplication.CreateBuilder(args);

// افزودن سرویس‌های MVC
builder.Services.AddControllersWithViews();

var app = builder.Build();

// تنظیم پایپ‌لاین درخواست
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles(); // برای سرو فایل‌های استاتیک
app.UseRouting();
app.UseAuthorization();

// تنظیم مسیر پیش‌فرض برای MVC
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();
  • مطمئن شوید که app.UseRouting() و app.MapControllerRoute (برای MVC) یا app.MapControllers() (برای Web API) فراخوانی شده‌اند.
  • اگر از Minimal API استفاده می‌کنید، بررسی کنید که مسیرهای موردنظر (مثلاً app.MapGet("/", ...) تعریف شده باشند.
  • اگر به فایل‌های استاتیک (مانند wwwroot/index.html) وابسته هستید، مطمئن شوید که app.UseStaticFiles() فراخوانی شده است.

3. بررسی کنترلرها و مسیرها
  • اگر از MVC یا Web API استفاده می‌کنید، مطمئن شوید که کنترلری با مسیر پیش‌فرض وجود دارد. به عنوان مثال، برای مسیر / باید کنترلری مثل زیر داشته باشید:
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}
  • بررسی کنید که فایل Views/Home/Index.cshtml وجود دارد.
  • برای Web API، مطمئن شوید که کنترلرها با [Route] یا [ApiController] به درستی تنظیم شده‌اند.

4. پاکسازی و بازسازی پروژه
  • پوشه‌های bin و obj را از پروژه حذف کنید.
  • در ویژوال استودیو، از منوی Build گزینه Clean Solution و سپس Rebuild Solution را اجرا کنید.
  • کش ویژوال استودیو را پاک کنید:
  • ویژوال استودیو را ببندید.
  • پوشه %LocalAppData%\Microsoft\VisualStudio\17.0_xxx\ComponentModelCache را حذف کنید.
  • ویژوال استودیو را دوباره باز کنید.

5. بررسی نسخه .NET و بسته‌های NuGet
  • فایل پروژه (.csproj) را بررسی کنید تا مطمئن شوید که نسخه .NET مورد استفاده (مثلاً <TargetFramework>net9.0</TargetFramework>) با SDK نصب‌شده سازگار است (اگر از دات‌نت 9 استفاده شده، باید SDK مرتبطی را هم نصب کنید).
  • در ویژوال استودیو، به Tools > NuGet Package Manager > Manage NuGet Packages for Solution بروید و همه بسته‌ها را به آخرین نسخه به‌روزرسانی کنید.

6. بررسی تنظیمات Kestrel و HTTPS
  • اگر از Kestrel استفاده می‌کنید، مطمئن شوید که تنظیمات پورت‌ها در appsettings.json یا Program.cs درست است. به عنوان مثال:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseKestrel(options =>
{
    options.ListenLocalhost(5000, listenOptions => listenOptions.UseHttps());
});
  • اگر با HTTPS مشکل دارید، گواهی SSL را بررسی کنید:
  • در ویندوز، دستور dotnet dev-certs https --trust را اجرا کنید تا گواهی توسعه نصب و اعتماد شود.
  • اگر نیازی به HTTPS ندارید، موقتاً app.UseHttpsRedirection() را غیرفعال کنید.

7. اجرای پروژه از خط فرمان
برای بررسی اینکه آیا مشکل از ویژوال استودیو است یا خیر، پروژه را با دستورات خط فرمان اجرا کنید:
  • به پوشه پروژه بروید و دستورات زیر را اجرا کنید:
dotnet clean
dotnet build
dotnet run
  • خروجی کنسول را بررسی کنید و ببینید آیا برنامه روی https://localhost:5001 اجرا می‌شود یا خیر.
  • اگر با dotnet run کار کرد، مشکل احتمالاً در تنظیمات ویژوال استودیو یا IIS Express است.

8. به‌روزرسانی ویژوال استودیو
ممکن است باگ‌های خاصی در این نسخه‌ی VS وجود داشته باشد. در Visual Studio Installer، بررسی کنید که آیا نسخه جدیدتری وجود دارد و آن را نصب کنید.

9. ایجاد پروژه جدید برای مقایسه
  • یک پروژه جدید ASP.NET Core (مثلاً MVC یا Web API) در ویژوال استودیو 2022 ایجاد کنید و ببینید آیا همان خطای 404 را دریافت می‌کنید.
  • فایل‌های Program.cs، launchSettings.json و ساختار پروژه را با پروژه مشکل‌دار مقایسه کنید.
  • این کار می‌تواند به شناسایی تغییرات یا تنظیمات نادرست کمک کند.

10. بررسی لاگ‌ها و دیباگ
  • لاگ‌های بیشتری را فعال کنید تا جزئیات بیشتری از درخواست‌ها دریافت کنید. به عنوان مثال:
builder.Services.AddLogging(logging =>
{
    logging.AddConsole();
    logging.SetMinimumLevel(LogLevel.Debug);
});
  • هنگام دیباگ، breakpoint را در Program.cs روی app.Run() قرار دهید و درخواست را بررسی کنید.

نکات اضافی
  • اگر پروژه شما از Angular یا SPA (مانند React) استفاده می‌کند، مطمئن شوید که app.UseSpa() و تنظیمات مربوط به آن به درستی پیکربندی شده است.


مشاهده مطلب اصلی