Ошибка 404.0 для приложения ASP.NET MVC 3 на IIS 7.0 / Windows Server 2008 - PullRequest
32 голосов
/ 25 февраля 2011

Я пытаюсь развернуть приложение ASP.NET MVC 3 на сервере Windows 2008 x64 (очевидно, под управлением IIS 7.0), и IIS, похоже, не хочет правильно обслуживать контент.Все запросы приводят к ошибке 404.0, поскольку запросы не соответствуют ни одному из обработчиков, а IIS пытается использовать обработчик StaticFile для обслуживания запросов.Эта проблема, по-видимому, связана с .NET 4.0, поскольку у меня приложение MVC 2 прекрасно работает в пуле приложений, настроенном для среды выполнения .NET 2.0.

У меня не было проблем при развертывании этого же приложенияна серверах IIS 7.5 как в Windows 7, так и в Windows Server 2008 R2.

До развертывания на сервере 2008 не было установлено .NET 4.0 или ASP.NET MVC 3, поэтому ниже приведены шаги, которые я предпринял доРазвертывание приложения:

  1. Установлено .NET 4.0
  2. Запущен aspnet_regiis.exe (из папки Framework64 / v4.0.30319)
  3. Установлен ASP.NET MVC 3 с использованиемустановщик веб-платформы
  4. Прикладное обновление MS KB980368 , позволяющее некоторым обработчикам IIS 7.0 или IIS 7.5 обрабатывать запросы, URL-адреса которых не заканчиваются точкой

Запросыстатические ресурсы в приложении (файлы JavaScript, изображения и т. д.) проходят без перебоев, но любой запрос к действию MVC завершается с ошибкой 404.0.Я заметил, что IIS использует обработчик StaticFile для обработки этих запросов, что, очевидно, неверно.Насколько я могу судить, обработчики ASP.NET 4.0 (то есть обработчики ExtensionlessUrl-ISAPI-4.0 *) правильно определены, поэтому я понятия не имею, почему / как запрос не будет обработан одним из этих обработчиков и приведет к падению всехвплоть до обработчика StaticFile.

Я также натолкнулся на следующую статью базы знаний MS , в которой упоминается, что вы должны убедиться, что перенаправление HTTP и сжатие статического содержимого включены / установлены на сервере, где выиспытывают 404 ошибки.Я проверил, и обе функции уже были включены для моего сервера.Я даже пытался удалить и переустановить функции, но безрезультатно.

На данный момент у меня совершенно нет идей, почему это не работает должным образом.Мне удалось повторить проблему на 2 разных серверах IIS 7.0.Чего мне не хватает?

Ответы [ 6 ]

36 голосов
/ 25 февраля 2011

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

Просто добавьте следующее в вашу веб-конфигурацию:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

Редактировать : предоставить дополнительные поясненияпо данному вопросу.В моем случае, когда я добавлял пользовательские сопоставления маршрутов, IIS рассматривал запросы как запросы к папке / статическому файлу и, таким образом, пропускал рабочий процесс ASP.NET.В среде разработки это ведет себя по-разному, в основном потому, что оно запускается на веб-сервере разработки, который также пропускает все запросы через процесс .net.

Эта запись веб-конфигурации сообщает IIS, что у вас есть модули, которые должны запускаться при каждом веб-запросе, даже если IIS определяет, что это статический файл или папка.

3 голосов
/ 05 марта 2011

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

http://www.tugberkugurlu.com/archive/running-asp-net-mvc-under-iis-6-0-and-iis-7-0-classic-mode---solution-to-routing-problem

http://www.tugberkugurlu.com/archive/deployment-of-asp-net-mvc-3-rc-2-application-on-a-shared-hosting-environment-without-begging-the-hosting-company

2 голосов
/ 17 марта 2012

Мое решение, после попытки ВСЕГО:

Плохое развертывание, старый PrecompiledApp.config зависал вокруг моего местоположения развертывания и заставлял все не работать.

Мойокончательные настройки, которые сработали:

  • IIS 7.5, Win2k8r2 x64,
  • Пул приложений в интегрированном режиме
  • Ничего не меняется в файле web.config - это означает отсутствие специальных обработчиков для маршрутизации.Вот мой снимок разделов, ссылки на многие другие сообщения.Я использую FluorineFX, поэтому мне добавили этот обработчик, но другие мне не нужны:

    <system.web>
      <compilation debug="true" targetFramework="4.0" />
      <authentication mode="None"/>
    
      <pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
      <httpRuntime requestPathInvalidCharacters=""/>
    
      <httpModules>
        <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx"/>
      </httpModules>
    </system.web>
      <system.webServer>
        <!-- Modules for IIS 7.0 Integrated mode -->
        <modules>
          <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx" />
        </modules>
    
        <!-- Disable detection of IIS 6.0 / Classic mode ASP.NET configuration -->
        <validation validateIntegratedModeConfiguration="false" />
      </system.webServer>
    
  • Global.ashx: (только метод любой заметки)

    void Application_Start(object sender, EventArgs e) {
        // Register routes...
        System.Web.Routing.Route echoRoute = new System.Web.Routing.Route(
              "{*message}",
            //the default value for the message
              new System.Web.Routing.RouteValueDictionary() { { "message", "" } },
            //any regular expression restrictions (i.e. @"[^\d].{4,}" means "does not start with number, at least 4 chars
              new System.Web.Routing.RouteValueDictionary() { { "message", @"[^\d].{4,}" } },
              new TestRoute.Handlers.PassthroughRouteHandler()
           );
    
        System.Web.Routing.RouteTable.Routes.Add(echoRoute);
    }
    
  • PassthroughRouteHandler.cs - это обеспечило автоматическое преобразование из http://andrew.arace.info/stackoverflow в http://andrew.arace.info/#stackoverflow, которое затем будет обрабатываться по умолчанию. Aspx:

    public class PassthroughRouteHandler : IRouteHandler {
    
        public IHttpHandler GetHttpHandler(RequestContext requestContext) {
            HttpContext.Current.Items["IncomingMessage"] = requestContext.RouteData.Values["message"];
            requestContext.HttpContext.Response.Redirect("#" + HttpContext.Current.Items["IncomingMessage"], true);
            return null;
        }
    }
    
2 голосов
/ 28 февраля 2011

В итоге проблема заключалась в том, что мой код полностью полагался на функцию автозапуска, которая доступна только в IIS 7.5.Мне удалось обнаружить проблему с помощью функции отслеживания невыполненных запросов в IIS, и теперь я изменил свой файл global.asax.cs, чтобы приложение правильно инициализировалось независимо от того, как / когда оно загружается.

0 голосов
/ 23 марта 2013

У меня была такая же проблема.Моя игра закончилась неудачной сборкой при запуске приложения.Я включил Fusion Log Viewer, чтобы увидеть, какие сборки вышли из строя, и выяснил это.Я бы никогда этого не обнаружил, так как это казалось проблемой маршрутизации MVC, но я решил, что опубликую это, если кто-нибудь еще потратит впустую часы на эту проблему!

0 голосов
/ 13 марта 2012

Если вы запускаете веб-приложение на IIS 7.5 или выше, убедитесь, что службы ролей для IIS включены правильно. Интересующие службы ролей: ASP.NET, базовая аутентификация, перенаправление HTTP, фильтры ISAPI и т. Д.

Вы можете перейти к службам ролей через Установка и удаление программ - Включение или отключение функций Windows. Надеюсь, это поможет.

С уважением, Киран Банда

...