IIS 7.5 возвращает 404 для одного маршрута MVC, но только после развертывания

Вопрос или проблема

У меня есть сайт, который хорошо работает на моей локальной дев-машине. Когда я запускаю всё в IIS Express, сайт работает нормально. Однако, когда я развертываю своё приложение в продакшн, всё работает, кроме одного маршрута. Этот маршрут MVC возвращает ошибку 404.

Я включил трассировку неудачных запросов и у меня есть файл трассировки. Всё, что я вижу в нём, это то, что есть предупреждение о “Модуле Установить статус ошибки ответа”, и написано, что это пришло от ManagedPipelineHandler.

Я не нашёл ничего уникального в этом маршруте. Всё, что я могу найти, говорит, что он должен работать, но по какой-то причине это не так.

Трассировка неудачных запросов читается как инструкция по использованию стереосистемы. Я не уверен, на что мне нужно обратить внимание.

1) Попробуйте добавить следующий код в ваш файл web.config:

<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<!-- остальная часть конфигурации -->
</system.webServer>

2) Убедитесь, что ваше приложение работает в режиме интегрированного конвейера ASP.Net 4.0. Если нет, установите этот пул приложений в режим интегрированного конвейера и перезапустите его один раз.

Ответ или решение

Проблема: Ошибка 404 для одного маршрута MVC в IIS 7.5 при развертывании

Когда ваше приложение MVC работает на локальной машине или в среде IIS Express, но возникает ошибка 404 только для одного маршрута после развертывания на IIS 7.5, это может быть связано с несколькими факторами. В данном ответе мы рассмотрим несколько подходов к диагностике и возможным решениям этой проблемы.

1. Проверьте конфигурацию маршрутизации

Первым делом необходимо убедиться, что маршруты в вашем приложении правильно настроены. При развертывании на IIS некоторые настройки могут отличаться от локальной среды. Проверьте, правильно ли определён маршрут, к которому возникает ошибка, и есть ли у него соответствующее соответствие в методе RegisterRoutes.

Пример настройки маршрутов в RouteConfig:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

Если ваш маршрут специфичен, убедитесь, что он не перекрывается другими маршрутами.

2. Включите отладку и проверьте журнал событий

Включите отладку в web.config, установленную на true, чтобы получить более подробную информацию о возникающих ошибках. Также посмотрите журналы событий Windows и журналы IIS для выявления дополнительных подсказок о том, почему возвращается ошибка 404.

Пример активации отладки в web.config:

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
</configuration>

3. Настройка Failed Request Tracing

Вы правильно сделали, что включили трассировку неудачных запросов. Обратите внимание на все предупреждения или ошибки, которые могут быть указаны в отчете. Если предупреждение о "Set Response Error Status" от ManagedPipelineHandler имеет место, это может указывать на то, что IIS не может правильно обработать запрос. Поищите конкретные статусы и коды ошибок, которые могут дать больше информации.

4. Измените конфигурацию модуля

Попробуйте добавить следующий код в ваш файл web.config. Это позволит вам убедиться, что все управляемые модули обрабатывают все запросы:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <!-- остальная часть конфигурации -->
</system.webServer>

Это может помочь вместе с вашей существующей конфигурацией маршрутов.

5. Обновление версии и режима конвейера

Убедитесь, что ваше приложение работает на версии ASP.NET 4.0 и в режиме интегрированного конвейера. Для этого откройте IIS Manager, выберите пул приложений вашего сайта, и убедитесь, что установлен режим "Integrated". После изменений обязательно перезапустите пул приложений.

6. Логгирование ошибок

Если ошибка всё ещё возникает, добавьте логирование в контроллер, который отвечает за этот маршрут, чтобы помочь отследить запросы и убедиться, что он действительно достигает вашей логики.

public ActionResult YourAction()
{
    try
    {
        // Ваша логика здесь
    }
    catch (Exception ex)
    {
        // Логируем ошибку
        Debug.WriteLine(ex);
        return View("Error");
    }
}

Заключение

Ошибка 404 для одного маршрута MVC в IIS 7.5 может быть вызвана множеством факторов, включая неправильные маршруты, конфигурацию IIS или наличие специфических ошибок в коде. Следуя предложенным шагам, вы сможете диагностировать и устранить причину проблемы. Помните, что опытный подход к созданию логов и изучению отчетов о записях запросов ведёт нас к успешному решению подобных проблем.

Оцените материал
Добавить комментарий

Капча загружается...