IIS 7 не может обслуживать страницы ASPX, но работает с файлами по умолчанию

1325
CesarGon

Я развернул веб-сайт ASP.NET 4 в IIS 7 на Windows Server 2008. Когда я просматриваю корневую папку или любую другую папку на сайте, сервер отвечает, предоставляя страницу по умолчанию, Default.aspxкак и следовало ожидать. Однако, когда я запрашиваю определенную страницу с .aspxрасширением, я получаю ошибку 404.

Например, когда я запрашиваю:

http://localhost/MyWeb/ 

сервер успешно доставляет http://localhost/MyWeb/Default.aspx. Однако, если я явно запросить:

http://localhost/MyWeb/Default.aspx 

затем IIS отвечает с ошибкой 404.

Детали ошибки следующие:

Module: IIS Web Core Notification: MapRequestHandler Handler: StaticFile Error code: 0x80070002 

.NET Framework, очевидно, установлен и работает, так как я могу добраться до страниц по умолчанию. Кстати, я заметил, что при сбое сервера и отображении страницы с ошибкой 404, введенный мной URL-адрес (например, http://localhost/MyWeb/Default.aspx) сбрасывает расширение (и читает http://localhost/MyWeb/Default).

Я попытался запустить aspnet_iisreg -iи перезапустить сервер, но ничего не изменилось.

Что мне не хватает? Спасибо.

ОБНОВИТЬ. Я публикую здесь web.configсвой сайт. Нет других конфигурационных файлов, которые применяются к нему.

<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration>  <appSettings> <add key="DatabaseServer" value="CONWAY\SQLEXPRESS"/> <add key="DatabaseName" value="KaleidoScape"/> <add key="User" value="KaleidoScapeUser"/> <add key="Password" value="Scape1!"/> </appSettings>  <system.web>  <compilation debug="true" targetFramework="4.6.1" /> <httpRuntime targetFramework="4.6.1" />  <pages> <namespaces> <add namespace="System.Web.Optimization" /> </namespaces> <controls> <add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" /> <add tagPrefix="uc" tagName="FileGallery" src="~/Controls/FileGallery/FileGallery.ascx" /> </controls> </pages>  <authentication mode="Forms"> <forms defaultUrl="~/App" loginUrl="~/Default.aspx" slidingExpiration="true" timeout="120" name="Incipit.KaleidoScape" /> </authentication>  <authorization> <allow users="*" /> </authorization>  </system.web>  <location path="App"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location>  <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="WebGrease" culture="neutral" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" /> </dependentAssembly>  </assemblyBinding> </runtime> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" /> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" /> </compilers> </system.codedom> </configuration> 

ОБНОВИТЬ. Записи журнала IIS для неудавшегося запроса следующие:

2016-10-23 21:13:22 127.0.0.1 GET /MyWeb/MyPage.aspx - 80 - 127.0.0.1 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.0;+WOW64;+Trident/5.0) 301 0 0 46 2016-10-23 21:13:22 127.0.0.1 GET /MyWeb/MyPage - 80 - 127.0.0.1 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.0;+WOW64;+Trident/5.0) 404 0 2 0 

Обратите внимание, что есть две записи. Первый соответствует MyPage.aspx, это страница, которую я запросил, набрав в поле URL. Это приводит к ошибке 301 (перемещена навсегда). Сразу после этого есть запись для той же страницы без .aspxрасширения, что приводит к ошибке 404 с подстату 0. Я не понимаю, почему полный URL-адрес получает 301 и почему сервер затем пытается доставить (и не удается) страница без расширения.

ОБНОВИТЬ. Я только что провел интересный эксперимент. Я создал новое веб-приложение на своем сервере, имеющее один Test.aspxфайл. Это сработало, как и ожидалось, т.е. сервер доставляет страницу, когда вы запрашиваете ее явно. Затем я скопировал все содержимое с веб-сайта, который вызывает у меня головную боль, и Test.aspxперестал работать! Затем я удалил все из этой сети, за исключением Test.aspxфайла, и он не вернулся к работе, а остался неработающим. В заключение, в веб-контенте есть что-то, что мешает и остается после удаления контента. Это веб-сайт, который я создал с помощью Visual Studio 2015, используя шаблон проекта, который поставляется с Bootstrap, и некоторые другие вещи. Я совершенно сбит с толку.

3
Я думаю, вы также заметили «Обработчик: StaticFile», что было бы неправильно. В случае, если это помогает людям отлаживать: что, если вы добавите простой файл HTML с именем `Default` (без расширения) в файловую систему? Arjan 8 лет назад 0
@Arjan: Да, я знаю, что StaticFile не так. Почему-то сервер не обрабатывает файлы ASPX должным образом. Но я не знаю почему. CesarGon 8 лет назад 0
Итак, обслуживается ли файл с именем `Default`, если он существует, при явном запросе` http: // localhost / MyWeb / Default.aspx`? _ «Почему-то сервер не обрабатывает файлы ASPX должным образом» _ - или он перенаправляет на версию без расширения .aspx, даже не пытаясь. Arjan 8 лет назад 0
Нет. Сервер по-прежнему выдает ошибку 404. CesarGon 8 лет назад 0
Вы настроили ASP.NET для локального хоста или только для MyWeb? harrymc 8 лет назад 0
@harrymc: ASP.NET был установлен на сервере целую вечность. Другие веб-сайты на этом компьютере работают нормально. Только этот конкретный веб-сайт не работает. CesarGon 8 лет назад 0
Есть ли у этого сайта собственный web.config? Можете ли вы опубликовать файлы конфигурации, которые могут применяться к веб-сайту? harrymc 8 лет назад 0
Существует только один web.config, влияющий на сайт. Я добавил это сейчас в ОП. Не волнуйтесь о полномочиях там; они подделки ;-) CesarGon 8 лет назад 0
Содержит ли файл `Default.aspx` исполняемый код? (Или это просто обычный HTML? В этом случае: добавьте некоторый код и проверьте его на предмет анализа.) И есть ли у других веб-сайтов ``определен для расширения` .aspx`? Arjan 8 лет назад 0
Default.aspx имеет код, и он анализируется и выполняется, когда используется как файл по умолчанию (т.е. при запросе папки). Однако он не анализируется или не выполняется, когда отображается ошибка 404. CesarGon 8 лет назад 0
Добавьте поле `sc-substatus` в журнал IIS, чтобы различить около 20 различных [404 вариантов] (https: //support.microsoft.comAdd%20/en-us/kb/943891). Проверьте, что отличается для этого одного веб-сайта на сервере, например, дополнительные настройки, обработчики, пулы приложений, разрешения для папок и т. Д. harrymc 8 лет назад 0
@harrymc: я публикую записи в журнале для ошибки 404. CesarGon 8 лет назад 0
Хм, с новыми журналами я не понимаю, почему файл `Default` без какого-либо расширения не обслуживается, когда запрашивается` Default.aspx`, так как `301` предлагает явное перенаправление, а следующая строка показывает, что браузер действительно пытаясь получить это. В любом случае: так, перенаправление на URL без суффикса `.aspx` является виновником, который настраивается не в` web.config`, а где-то на экранах настройки ISS, я полагаю? Arjan 8 лет назад 0
Насколько я вижу, перенаправление HTTP отключено. CesarGon 8 лет назад 0
`Default.aspx` добавлен в список файлов по умолчанию? Burgi 8 лет назад 0
Да, конечно. На вершине. CesarGon 8 лет назад 0
Теперь я добавил третье обновление об эксперименте, который я только что провел. Очень странно. Я ухожу спать до завтра. Спасибо всем, кто помог. CesarGon 8 лет назад 0
Используете ли вы какие-либо расширения или модули ISAPI помимо ASP.NET? Примечание. Если альтернативный URL-адрес не возвращается с ответом 301, то обычно перенаправление URL-адреса настраивается неправильно. Создает ли ASP.NET-код этого веб-сайта файл .config или добавляет правила перенаправления / перезаписи (проверьте в диспетчере IIS)? harrymc 8 лет назад 0
Насколько я знаю, я не использую какие-либо сторонние модули или расширения ISAPI. Код ASP.NET на веб-сайте довольно стандартный: он использует Bootstrap и несколько зависимостей javascript, но это все. У меня есть другие подобные сайты, которые работают нормально. CesarGon 8 лет назад 0
Проблема, по-видимому, возникает после однократного запуска веб-сайта, а затем остается. Если после этого запуска вы не найдете ничего особенного в этом веб-сайте, например, в диспетчере IIS или в каком-либо конфигурационном файле, маловероятно, что мы найдем его здесь. Единственный совет, чтобы найти проблему, которую я могу дать, это перезапустить с нуля и добавлять файлы, пока вы не найдете тот, который вызывает его, а затем выборочно редактировать файл (каждый раз запускать новый сайт, ой). harrymc 8 лет назад 0
@harrymc: я согласен с твоим советом. Я сделаю это, и я сообщу, когда / если я найду что-нибудь. Спасибо за ваше время. CesarGon 8 лет назад 0

1 ответ на вопрос

2
CesarGon

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

Проблема связана с механизмом «дружественных URL», который доступен в IIS 7. Я деактивировал их, изменив код App_Start\RouteConfig.csс:

var settings = new FriendlyUrlSettings(); settings.AutoRedirectMode = RedirectMode.Permanent; routes.EnableFriendlyUrls(settings); 

чтобы:

var settings = new FriendlyUrlSettings(); settings.AutoRedirectMode = RedirectMode.Off; routes.EnableFriendlyUrls(settings); 

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

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

Для будущих читателей, или если вы все еще хотите решить исходную проблему: может быть, маршруты в RouteConfig включают суффикс .aspx тогда? Arjan 8 лет назад 0
@Arjan: Я не уверен, что следую за тобой. Никакие маршруты явно не используются на веб-сайте. CesarGon 8 лет назад 0
Ах, глядя на несколько примеров, я понял, что файл RouteConfig будет определять маршруты. Ну что ж, решил за тебя :-) Arjan 8 лет назад 2
Так что я был прав - это была проблема с перенаправлением. harrymc 8 лет назад 0
Так что я был прав - это была проблема с перенаправлением. ;-) Arjan 8 лет назад 1
Частично. Насколько я вижу, это «перенаправление», используемое механизмом дружественных URL-адресов, который, кажется, использует результирующий код 301 «постоянно перемещенный», чтобы заставить сервер доставлять файл без расширения. CesarGon 8 лет назад 0
Дружественные URL-адреса кажутся испорченными или плохо используемыми в приложении, поскольку предполагается, что он делает противоположное: перенаправляет виртуальный URL без расширения на реальный. harrymc 8 лет назад 0
@Arjan: Значит, мы были правы - это была проблема с перенаправлением; =) harrymc 8 лет назад 0

Похожие вопросы