Получение ошибки 404.0 для ASP.NET приложение MVC 3 на IIS 7.0 / Windows Server 2008
Я пытаюсь развернуть 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 установлен, поэтому вот шаги, которые я предпринял до развертывания приложения:
- установлен .NET 4.0
- Ran aspnet_regiis.exe (из Framework64 / v4.0.30319 папка)
- установлен ASP.NET использование MVC 3 установщик веб-платформы
- применено обновление 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 ответов
на самом деле вы просто напомнили мне, что мне нужно исправить эту проблему в окружающей среде здесь. Если ваша ситуация такая же, как моя, то это простое решение.
просто добавьте следующее в свою веб-конфигурацию:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
редактировать: предоставить дополнительные разъяснения по рассматриваемому вопросу. В моем случае, когда я добавил пользовательские сопоставления маршрутов, IIS видел запросы как запросы папок / статических файлов и, таким образом, пропускал ASP.NET рабочий процесс. Это ведет себя по-разному в среде разработки, как правило, потому что он запускается под веб-сервером разработки, который также будет передавать все запросы через процесс .net.
эта запись веб-конфигурации сообщает IIS, что у вас есть модули, которые должны выполняться при каждом веб-запросе, даже если IIS определяет его как статический файл или папку.
убедитесь, что вы работаете в интегрированном режиме IIS 7.0. Если необходимо запустить его в классическом режиме IIS 7.0, необходимо выполнить несколько действий для работы маршрутов. Пожалуйста, обратитесь к следующему блогу сообщения;
проблема заключалась в том, что мой код полностью полагался на функцию автоматического запуска, доступную только в IIS 7.5. Я смог обнаружить проблему с помощью функции трассировки неудачных запросов в IIS,и теперь я изменил свой глобальный.асакс.cs-файл, чтобы приложение было правильно инициализировано, независимо от того, как/когда оно загружается.
мое решение, попробовав все:
плохое развертывание, старый PrecompiledApp.config болтался вокруг моего места развертывания, и все не работало.
мои последние настройки, которые работали:
- IIS 7.5, Win2k8r2 x64,
- пул приложений интегрированного режима
-
в интернете ничего не меняется.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>
-
глобальные.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; } }
Если вы используете веб-приложение на IIS 7.5 или выше, убедитесь, что службы ролей для IIS включены должным образом. Ролевыми услугами, представляющими интерес, являются : ASP.NET, базовая аутентификация, перенаправление HTTP, фильтры ISAPI и т. д.
вы можете перейти к службам ролей с помощью добавления или удаления программ-включение или выключение функций Windows. Надеюсь, это поможет.
с уважением, Киран Банда
У меня была та же проблема. Мой оказался неудачной сборкой при запуске приложения. Я включил Средство просмотра журнала Fusion, чтобы увидеть, какие сборки терпят неудачу, и понял это. Я бы никогда не обнаружил этого, так как это казалось проблемой маршрутизации MVC, но я решил, что опубликую это, если кто-то еще потратил часы на эту проблему!