Страница HTTP 404 не найдена в Web Api, размещенном в IIS 7.5
У меня есть приложение Web Api. Он отлично работает, когда я тестировал его на сервере отладки VS 2010. Но теперь я развернул его в IIS 7.5 и получаю ошибку HTTP 404 при попытке доступа к приложению.
Вот мой web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-FlowGearProxy-20123141219;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="true" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
27 ответов
Я тоже боролся с этим. К счастью, Стив Мичелотти задокументировал решение, которое сработало для меня здесь.
В конце дня я включил все глаголы (verb="*") в обработчик ExtensionlessUrlHandler-Integrated-4.0 в моей веб-конфигурации.
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
Другие отметили, что наличие WebDAV вызывает проблемы. К счастью, я также не столкнулся с этой проблемой.
Была такая же проблема. Этот параметр конфигурации решил проблему.
<system.webServer>
.....
<modules runAllManagedModulesForAllRequests="true" />
.....
</system.webServer>
Как объясняется в http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html выше решение следует избегать. Используйте это вместо этого. Такое же решение предлагает и Lopsided. Сохранение этого здесь, чтобы позволить пользователям избежать реализации первого рабочего решения.
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
<!-- any other modules you want to run in MVC e.g. FormsAuthentication, Roles etc. -->
</modules>
Если IIS установлен или включен после ASP.NET, вам потребуется вручную зарегистрировать ASP.NET в IIS, чтобы ваше приложение.NET работало.
Для Windows 7 и более ранних версий:
- Запустите командную строку (cmd.exe) от имени администратора.
- Перейдите в соответствующее местоположение.NET Framework. (например, C:\Windows\Microsoft.NET\Framework64\v4.0.30319)
- Запустите aspnet_regiis.exe -i
Для Windows 8 и более поздних версий:
- В меню "Пуск" введите "Включить или отключить функции Windows" и выберите первый результат.
- Разверните Internet Information Services: World Wide Web Services: функции разработки приложений и выберите ASP.NET 4.5 (или ASP.NET 3.5, если вам нужно поддерживать проекты в.NET Framework 2.0-3.5).
- Нажмите ОК.
Запускаете ли вы приложение Web API в виртуальном каталоге или в приложении?
Например: у меня возникла та же проблема, когда я переместил свой проект в локальный IIS на веб-сайте по умолчанию> SampleWebAPI. Я считаю, что это связано с изменением URL
пойдут следующим образом:
Оригинал: localhost:3092/api/values
Перемещено: localhost/SampleWebAPI/api/values
Если вы переместите проект Web API на собственный веб-сайт, работающий на другом порту, он, похоже, будет работать.
Дополнительное примечание: я еще больше усложнил проблему, добавив api
в качестве псевдонима приложения на моем сайте, который вызвал эффективное URL
быть:
localhost:81/api/api/values
- заметил это после перемещения сайта на собственный сайт
Поэтому, поскольку я хотел поддерживать разделение между моим сайтом и сайтом проекта web api mvc, я изменил правила маршрутизации в global.asax
для веб-API "DefaultAPI" из api/{controller}/{id}
в {controller}/{id}
и ASP.NET MVC один Default
от {controller}/{id}
в info/{controller}/{id}
,
Это единственный ответ, который работал для меня...
У меня была похожая проблема... Казалось, что бы я ни делал, ничего не перенаправлялось, а мой глобальный файл просто игнорировался. Я всерьез подумал, что нужно просто положить конец всему, прежде чем я нашел этот ответ. Я надеюсь, что эта ссылка поможет кому-то еще.
Добавление следующего в файл web.config работал для меня:
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
</system.webServer>
Конечно, тег system.webServer уже был там, но я добавил к нему тег modules, а затем удалил и добавил теги modules.
Несколько вещей, чтобы проверить:
- Убедитесь, что у вас установлен.NET Framework 4.
- Убедитесь, что для вашего веб-сайта и виртуального каталога выбрана версия 4.NET Framework (если применимо).
- Убедитесь, что у вас установлен MVC или есть соответствующие библиотеки DLL в каталоге bin.
- Возможно, нужно разрешить расширения веб-службы ASP.NET 4.0
- Поместите приложение в его собственный пул приложений.
- Убедитесь, что у каталога есть как минимум права "Только сценарии".
У меня была похожая проблема. У меня были правильные настройки в моем файле web.config, но я запускал пул приложений в классическом режиме, а не в интегрированном режиме
Эта проблема также может произойти из-за следующих
1. В Сети. Конфиг
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<system.webServer>
2. Убедитесь, что в папке bin на сервере, где развернут веб-API, доступно следующее
System.Net.Http
System.Net.Http.Formatting
System.Web.Http.WebHost
System.Web.Http
Эти сборки не будут скопированы в папку bin по умолчанию, если публикация выполняется через Visual Studio, поскольку пакеты Web API устанавливаются через Nuget на компьютере разработчика. Тем не менее, если вы хотите, чтобы эти файлы были доступны как часть публикации Visual Studio, вам нужно установить для CopyLocal значение True для этих сборок.
Садиш Кумар.В
Я тоже столкнулся с этой проблемой. Я решил проблему, перейдя в Пулы приложений> Имя пула приложений и изменил.NET Framework с версии v.2.0.50727 на v4.0.30319.
Исходя из этого ответа, я просто должен был изменить path="*."
в path="*"
для добавленного ExtensionlessUrlHandler-Integrated-4.0
в configuration>system.WebServer>handlers
в моем web.config
До:
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
После:
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Мне пришлось отключить опцию публикации файлов "Прекомпилировать во время публикации".
Существует официальное исправление от Microsoft: http://support.microsoft.com/kb/980368
Я настоятельно не рекомендую использовать
Я начал получать 404 ответа от Web API после обучения Windows Azure, в котором говорилось, что мне нужно добавить файл "WebRole.cs" в мой проект.
После удаления "WebRole.cs" из моего проекта мои вызовы Web API снова начали работать.
В моем случае проблема заключалась в том, что я пытался зайти на сайт по адресу
myserver.myintranet.com/mysite
Но в привязке веб-сайта для http в IIS не было указано имя хоста, указанное в привязке. Это работало раньше, и я понятия не имею, как это сорвалось.
Однажды я положил myserver.myintranet.com
в имя хоста 404 исчез.
В диспетчере IIS перейдите в раздел "Привязки..." на панели действий, а затем измените привязку http, чтобы указать имя хоста.
Убедитесь, что пул приложений находится в интегрированном режиме.
И добавьте следующее в файл web.config:
<system.webServer>
.....
<modules runAllManagedModulesForAllRequests="true" />
.....
</system.webServer>
Я тоже боролся с этим. Моя точная проблема заключалась в том, что у меня был веб-сервис ASMX, который, когда я вводил параметр в веб-метод и проверял его, давал мне 404. В прошлом конкретный метод работал нормально и не менялся, только переиздан. Тогда я попал сюда и попробовал все опубликованные ответы, и ничего не помогло.
Мое окончательное решение? Я знаю, что это радикально, но я только что создал новое решение Visual Studio и веб-проект. Выбрал MVC, затем я сделал "Add" > "New Item", выбрал "Visual C#" > "Web" и "Web Service (ASMX)" под этим. Я скопировал весь свой старый код с выделенным кодом, затем принял к сведению пространство имен, которое дало новый файл в моем новом проекте, затем вставил весь свой старый код в новый файл с выделенным кодом в новом проекте и поместил пространство имен вернуться к тому, что было. Затем я создал свои папки в своем проекте, которые у меня были до того, как с помощью Visual Studio выполнить команду "Добавить"> "Новая папка", затем скопировал обратно свои файлы в папки из моего другого проекта с помощью проводника Windows, затем щелкнул правой кнопкой мыши каждую папку в Visual Studio и сделал "Добавить"> "Существующий элемент..." и перетащил элементы из этих папок в папки моего нового проекта Visual Studio. Я снова сослался на все свои сборки.NET, открыв оба проекта, чтобы я мог сравнить, на какие из них я ссылался ранее (у меня была тонна!). Мне пришлось назвать свой новый проект немного по-другому - в основном я сделал что-то сравнимое с "GeneralWebApp" вместо "MyWebApp", например - поэтому мне пришлось сделать "Заменить все" во всем моем решении, чтобы заменить это имя, так что это получить правильное пространство имен для всех моих файлов. Затем я выполнил "Rebuild All" в проекте, а затем запустил его с помощью кнопки "Play", которую выдает Visual Studio, когда я получил его для правильной сборки. Работало нормально. Поэтому я опубликовал его, и все было хорошо на сервере, где я его опубликовал, когда я запускал его оттуда. У меня нет объяснения тому, что произошло, но вот как я это пережил. Это не плохой тест, просто чтобы посмотреть, не испортила ли что-то Visual Studio.
Я ничего не делаю, просто добавьте этот тег в web.config, его работа над этим вопросом подходит к одному из следующих пунктов
Используйте Web Api в том же проекте, используя формы MVC или asp.net
Используйте RouteConfig и WebApiConfig в Global.asax как GlobalConfiguration.Configure(WebApiConfig.Register); RouteConfig.RegisterRoutes(RouteTable.Routes);
Используйте RouteConfig для 2 целей, формы asp.net используют с маршрутизацией friendlyurl и mvc для маршрутизации MVC
мы просто используем этот тег в web.config, он будет работать.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
.........................
</modules>
</system.webServer>
Для меня проблема была в том, что корневой сайт был настроен для использования пула приложений.NET 2.0, и моим приложением на этом сайте было.NET 4.5.
Я создал новый сайт с пулом приложений.NET 4 и поместил свое приложение в корень этого - и это работало нормально.
У меня была та же проблема: ответ 404 для контроллеров веб-API при обслуживании из IIS, но с VS2010 все работало нормально. Ни одно из вышеперечисленных решений не помогло мне. В конце концов я обнаружил, что проблема заключалась в том, что мы добавили поддержку приложения WSE 3.0, а в каталоге / bin приложения отсутствовала библиотека Microsoft.Web.Services3. Странно, но после копирования dll отображение маршрута начало работать.
Если поместить в IIS только папку bin (после сборки проекта), возникнет и эта проблема. В этой ситуации вы должны опубликовать проект с помощью VisualStudio, а затем поместить опубликованную папку в IIS.
Я потратил много времени, пытаясь сделать много вещей, чтобы наконец понять, что я добавляю свое веб-приложение не в Сайты / Веб-сайты по умолчанию, а в другой веб-сайт, связанный с другим портом. Очевидно, что попытка localhost на порту 80 даст 404.
Какой HTTP-запрос вы делаете?
Это немного левый ответ, но вы пытались удалить страницу ошибки IIS по умолчанию для 404, чтобы проверить, что на самом деле возвращает ваш API?
У меня была проблема, из-за которой я хотел, чтобы метод контроллера возвращал 404, когда я отправил неверный идентификатор. Я обнаружил, что всегда получаю страницу IIS 404 "Файл или каталог не найден", а не HTTP-ответ от моего API. Удаление страницы ошибки 404 по умолчанию решило проблему.
Другая проблема, но вы никогда не знаете, это может помочь;)
Попробуйте этот webconfg.. замените "NewsApi.dll" своей основной dll!
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\NewsApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
</system.webServer>
</location>
</configuration>
Для меня решение заключалось в удалении следующих строк из моего файла web.config:
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.3" newVersion="4.1.1.3" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Tokens" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
</dependentAssembly>
Я заметил, что VS добавил их автоматически, не знаю почему.
У меня ничего из вышеперечисленного не сработало. Наконец, это не было связано ни с какой конфигурацией.
Я получал ошибку 404 при попытке запустить сеанс отладки через Visual Studio 2017 с использованием встроенного IISExpress 10.0. Для меня это работало, когда релиз был опубликован на сервере IIS, но получал 404 при локальной отладке через VS.
Проблема оказалась в некоторых старых скомпилированных файлах, лежащих в каталоге bin проекта, которые, похоже, мешали. Наконец сделал "Чистое решение", закрыл VS, удалил папку bin и obj. Перезапустил VS и перестроил проект, и ошибка исчезла.
У меня была такая же проблема: на недавно установленной машине с Visual Studio 2013 проект веб-API работал под IISExpress, но не под локальным IIS. Я перепробовал все, что смог найти, но в конце концов проблема была не в Web API, а в MVC: даже если он был установлен, проект MVC не выполнялся.
Что мне помогло, так это удалить IIS (из ADD/REMOVE Windows Features), затем переустановить его и запустить aspnet_regiis -i. Может быть, это помогает кому-то еще.
Недавно у меня была ошибка 404 со всеми моими маршрутами / контроллерами Web Api 2. Поэтому я перешел на реальный сервер и попытался просмотреть, используя localhost вместо имени хоста, и получил "404.7 Not Found - Модуль фильтрации запросов настроен на запрет расширения файла".
Это действительно очевидный ответ / ошибка новичка, но я подумал, что просто поставлю его здесь, если это может кому-то помочь. Итак, моя структура заключалась в том, что у a был веб-сайт в IIS с внешним интерфейсом в качестве одного приложения под веб-сайтом, а серверный интерфейс был другим. Под серверным приложением находилось шесть отдельных приложений api. Я забыл преобразовать каждую из папок api в приложения в IIS, и, конечно, из-за этого маршруты к моим конечным точкам api возвращали ошибку 404.0.
Моя точка зрения: сначала проверьте простые вещи! Убедитесь, что вы преобразовали все папки в приложения в IIS, где это требуется для правильной работы вашего веб-сайта.
Столкнулся с той же проблемой с веб-API и.Net Core Web API. Хорошо работал в VS 2017 во время отладки, но вернул 404 при публикации в IIS 7.5. Решением для меня было изменить способ создания сайта. Вместо публикации в корне веб-сайта (созданного путем щелчка правой кнопкой мыши Сайты... Добавить веб-сайт) мне пришлось создать приложение (созданное путем щелчка правой кнопкой мыши веб-сайта... Добавить приложение) и опубликовать в этой папке. Обратите внимание, что для версии Core мне пришлось изменить настройку версии пула приложений.NET Framework на "No Managed Code".