Сторінку HTTP 404 не знайдено в Web Api, розміщеному в IIS 7.5


96

У мене є програма 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>

2
У мене те саме питання. Я ще не знайшов рішення, однак одне, що я виявив, це те, що якщо вибрати сайт у IIS, а потім перейти до функції Handler Mappings, існує зіставлення для статичних файлів, яке зіставляється * з файлом, який повинен існувати. Коли я вилучаю це зіставлення та додаю нове відображення для всіх дієслів HTTP, я більше не отримую 404, він замінюється порожньою білою сторінкою.
Деспертар

>> за допомогою VS 2010 налагоджувальний сервер розробників. - ТАКОЖ злий Кассіні. Див. Blogs.msdn.com/b/rickandy/archive/2011/04/22/… - Якщо це не спрацює, створіть новий додаток MVC 4 WebApi та протестуйте розгортання - просте
RickAndMSFT

Відповіді:


93

Я теж боровся з цим. На щастя, Стів Мікелотті задокументував рішення, яке працювало для мене тут .

Наприкінці дня я включив усі дієслова (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 викликає проблеми. На щастя, я теж не стикався з цим питанням.


3
+1 за це. Але я змінив це в Handler Mappings on the Application з за допомогою IIS Manager. Це було включено для купи дієслів. Я змінив це на всі дієслова (*) та вуаля. Але завжди краще вкладати в джерело.
Wolf5,

1
У мене та сама проблема, але ці зміни мені не допомогли. Чи існує якась інша конфігурація? Або може бути посиланням на бібліотеку? Будь-ласка, також див.: Stackoverflow.com/questions/27303523/…
Бабак

2
багато людей кажуть, що використання runAllManagedModulesForAllRequests вплине на продуктивність (перевірте відповіді hemant gautam нижче). Однак я не можу отримати той самий сервіс, тому я дотримуюся конфігурації тут: blog.maartenballiauw.be/post/2012/12/07/… Це посилання також вказує, що включення WebDAV може вплинути і на результат
Хоанг Лонг

Дивовижна відповідь!
EnocNRoll - AnandaGopal Pardue

1
Для мене дієслово було вже *. Мені довелося також змінити шлях, щоб *він працював так, як це *.все ще викликало проблему
Алсті

56

Мав те саме питання. Це налаштування конфігурації вирішило проблему.

<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>

Працює нормально, але це не дуже хороше рішення. Краще використовувати UrlRoutingModule (див. Відповідь Lopsided нижче). britishdeveloper.co.uk/2010/06/…
Der_Meister

37

Якщо IIS інстальовано або ввімкнено після ASP.NET, вам потрібно буде вручну зареєструвати ASP.NET у IIS, щоб програма .NET могла працювати.

Для Windows 7 і старіших версій:

  1. Запустіть командний рядок (cmd.exe) від імені адміністратора.
  2. Перейдіть до відповідного розташування .NET Framework. (наприклад, C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319)
  3. Запустіть aspnet_regiis.exe -i

Для Windows 8 та новіших версій:

  1. У меню "Пуск" введіть "Увімкнути або вимкнути функції Windows" і виберіть перший результат.
  2. Розгорніть Інформаційні служби Інтернету: Послуги всесвітньої павутини: Особливості розробки додатків і виберіть ASP.NET 4.5 (або ASP.NET 3.5, якщо вам потрібна підтримка проектів на .NET Framework 2.0-3.5).
  3. Натисніть кнопку ОК.

2
Я перейшов з IIS Express для розробки на повний IIS, і це те, що мені це виправлено. Дякую!
Jim Brown

1
Подібно до @JimBrown вище; це спрацювало для мене після переходу з IIS express.
SolidRegardless

Це вирішило це для мене. У Windows 7 Visual Studio 2015 Ent, новий веб-сайт MVC 5, змінено з IIS Express на повний IIS.
Geoff Gunter

26

Ви запускаєте програму Web API у віртуальному каталозі чи програмі?

Наприклад: у мене виникла та сама проблема, коли я перемістив свій проект до мого локального IIS на веб-сайті за замовчуванням> SampleWebAPI. Я вважаю, що це пов'язано зі зміною URLмаршрутизації наступним чином:

Оригінал: localhost:3092/api/values
Перенесено: localhost/SampleWebAPI/api/values

Якщо ви переносите проект Web API на власний веб-сайт, що працює на іншому порту, це, здається, працює.

Додаткова примітка: Я ще більше ускладнив проблему, додавши apiяк псевдонім програми на моєму веб-сайті, що призвело до ефективності URL:

localhost:81/api/api/values - помітив це після переміщення веб-сайту на власний веб-сайт

Тому, оскільки я хотів підтримувати поділ між своїм веб-сайтом та веб-сайтом проекту api mvc, я змінив правила маршрутизації global.asaxдля веб-API "DefaultAPI" з api/{controller}/{id}на {controller}/{id}та ASP.NET MVC Defaultз {controller}/{id}на info/{controller}/{id}.


3
хе-хе ... я також назвав свій додаток IISяк api. Це спричинило налагодження всіх цих спроб та помилок понад 2 години. Щиро дякую, що поділилися своїм досвідом! Перейменовано, і я знову повернувся до справи. : D
Леніель Маккаферрі

Дякую - це було моє питання! :)
Jen

Я не впевнений, чому дзвінки api не спрацьовували, коли я розмістив свій проект під портом 8080, просто перемістивши його як віртуальний каталог на веб-сайті за замовчуванням зробив свою справу :)
Кіран,

14

Це єдина відповідь, яка спрацювала у мене ...

У мене була подібна проблема ... Здавалося, незалежно від того, що я робив, нічого не перенаправлялося, а мій глобальний файл просто ігнорувався. Я серйозно думав просто закінчити все, перш ніж знайти цю відповідь. Сподіваюся, це посилання допомагає комусь іншому.


Мені вдалося додати наступне у файл 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 вже був там, звичайно, але я додав до нього тег модулів, а потім теги видалення та додавання до тегу модулів.


Вирішили цю проблему на сервері 2008 року (не R2), і це було єдине рішення, яке працювало для мене. Крім того, мені довелося поєднати це з налаштуванням пулу програм на «інтегрований» режим.
Zoomzoom

11

Кілька речей для перевірки:

  1. Переконайтеся, що у вас інстальовано .NET Framework 4.
  2. Переконайтеся, що для веб-сайту та віртуального каталогу вибрано версію 4 .NET Framework (якщо застосовується).
  3. Переконайтеся, що у вас встановлено MVC або є відповідні бібліотеки DLL у вашому каталозі бен.
  4. Можливо, потрібно дозволити розширення веб-сервісу ASP.NET 4.0
  5. Помістіть програму у власний пул програм.
  6. Переконайтесь, що каталог має принаймні дозволи на виконання лише "Сценарії".

У мене є 4 інші звичайні веб-програми, що працюють на тому самому сервері IIS, і всі вони використовують .net framework 4. Тож який із цих 4 пунктів не потрібен? коли я опублікував свою програму mvc, я додав додані розгортаючі залежності та додав ASP.NET MVC, так що це знаходиться в моєму каталозі bin
Арманд

@Armand Звучить, ви вже зробили No1. №2 все ще необхідний. Додаючи розгортаючі залежності, якщо ви зробили це, як описано тут: haacked.com/archive/2011/05/25/bin-deploying-asp-net-mvc-3.aspx , слід подбати про # 3 вище. # 4 може знадобитися, а може і не знадобитися, хоча я не маю знань, щоб повідомити вам, коли це є і не потрібно.
Джо Шраг

9

У мене була схожа проблема. У моєму файлі web.config були правильні налаштування, але я запускав пул програм у класичному, а не інтегрованому режимі

знімок екрана


7

Ця проблема також може трапитися через наступне

1. в Інтернеті. Config

<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, оскільки пакети веб-API встановлюються через Nuget на машині розробки. Тим не менше, якщо ви хочете, щоб ці файли були доступні як частина публікації Visual Studio, вам потрібно встановити для CopyLocal значення True для цих збірок

Садиш Кумар.В


Ці бібліотеки DLL потрібні, якщо на сервері не встановлено MVC. У моєму випадку я бачив порожню сторінку при спробі викликати API. Додавання DLL вручну працювало у мене. Дякую!!
Vipul bhojwani

Моя проблема була вирішена після додавання System.Net.Http до основної папки публікації, моєю було рішення Asp.net Core
mohas

6

На основі цього SO відповіді , я тільки що зміни 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" />

Щиро дякую, Грегу, я збирався мене вбити через цей дурний шлях = "*." але тепер, після скидання цієї жалюгідної крапки, все працює чудово! Велике спасибі!
Junior Silva

5

Я теж зіткнувся з цією проблемою. Я вирішив проблему, перейшовши до Пули програм> Назва пулу додатків і змінив .NET Framework з версії v.2.0.50727 на v4.0.30319.


1
Я теж це відкрив самостійно. Голосуючи за вашу відповідь, бо її легко пропустити. Коли я створив сайт для мого додатка, IIS автоматично створив для мене пул програм, встановлений на .NET v2.0 !! Чому, чому, чому ?? :)
Майк Таверн

3

Мені довелося відключити опцію публікації файлів "Попередньо скомпілювати під час публікації".


І де ти це робиш?
vapcguy

1
Це діалогове вікно, яке з’являється, коли ви клацаєте правою кнопкою миші на проект і вибираєте Опублікувати. Схоже , що це
Pakman

3

Є офіційне виправлення від Microsoft: http://support.microsoft.com/kb/980368

Я настійно НЕ рекомендую використовувати <модулі runAllManagedModulesForAllRequests = "true">. Це призводить до того, що всі запити (навіть .jpg, .css, .pdf тощо) будуть оброблятися всіма зареєстрованими модулями HTTP. Є два негативні моменти: а) додаткове навантаження на апаратні ресурси; б) потенційні помилки, оскільки модулі http оброблятимуть вміст нового типу.


1
Дякую так багато! Я спробував абсолютно все інше, і це було єдине, що це виправило.
Оран Деннісон,

Те саме тут, велике спасибі за додавання цієї відповіді! Це було рішення мого питання!
Октавіо Гарбаріно,

2

Я почав отримувати 404 відповіді з веб-API після дотримання підручника Windows Azure, який сказав мені додати файл "WebRole.cs" до свого проекту.

Після видалення "WebRole.cs" з мого проекту, мої дзвінки через веб-API знову запрацювали.


Це працювало для мене. Я переніс додаток Azure назад до розгортання віртуальної машини, і після коментування вмісту WebRole.cs мої дзвінки WebAPI знову запрацювали.
Скотт

Напевно, я витратив на це день! Коментуючи WebRole.cs спрацювало - дивуйтеся, чому все ж
Ігорек

2

Переконайтесь, що пул програм знаходиться в інтегрованому режимі,
і додайте у файл web.config наступне:

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

2

У моєму випадку проблема полягала просто в тому, що я намагався отримати доступ до сайту за адресою

myserver.myintranet.com/mysite

Але прив'язка веб-сайту для http у IIS не мала імені хосту, вказаного у прив'язці. Це працювало раніше, і я не уявляю, як це здуло.

Як тільки я myserver.myintranet.comвказав ім'я хоста, 404 зник.

У диспетчері IIS ви заходите в Прив'язки ... на панелі дій, а потім редагуєте прив'язку http, щоб вказати ім'я хосту.


Навіть я теж стикаюся з такою ж проблемою. і як ви запропонували, я перевірив ім’я хосту в прив’язку http, і воно оновилося лише належним чином. Але моя проблема все ще залишається. Примітка: Я розмістив свою програму API як дочірню програму. Будь ласка, підкажіть, якщо хтось має ідею щодо цього. приклад: "sample.example.com" є моєю основною програмою і створив API під цим доменом як "sample.example.com/myAPI/"
Крішна Мані


1

Була та сама проблема, відповідь 404 для веб-контролерів api при обслуговуванні з IIS, але все працювало нормально від VS2010. Жодне з наведених вище рішень не спрацювало для мене. Зрештою я виявив, що проблема полягала в тому, що ми додали підтримку WSE 3.0 для програми, а в каталозі / bin програми відсутня dll Microsoft.Web.Services3. Дивно, але після копіювання dll відображення маршрутів почало працювати.


1

Для мене проблема полягала в тому, що кореневий сайт був налаштований на використання пулу програм .NET 2.0, а моєю програмою на цьому сайті був .NET 4.5.

Я створив новий сайт із пулом програм .NET 4 і розмістив свою програму в корені цього - і це спрацювало нормально.


1

Я теж боровся з цим. Моя точна проблема полягала в тому, що у мене була веб-служба ASMX, яка, коли я вводив параметр у веб-метод і тестував його, то давала мені 404. Конкретний метод працював нормально в минулому і не змінювався, лише перевидано. Потім я потрапив сюди і спробував усі розміщені відповіді, і нічого не допомогло.

Моє остаточне рішення? Я знаю, що це кардинально, але я щойно створив нове рішення Visual Studio та веб-проект. Вибрав MVC, потім я зробив "Додати"> "Новий елемент", вибрав "Visual C #"> "Веб" та "Веб-служба (ASMX)" під цим. Я скопіював весь свій старий код із затримкою коду, потім взяв до відома простір імен, який він дав новий файл у моєму новому проекті, а потім вставив увесь мій старий код у новий файл із затримкою коду в новому проекті і помістив простір імен повернутися до того, що було.

Потім я створив у своєму проекті свої папки, які я мав до використання Visual Studio для виконання "Додати"> "Нова папка", потім скопіював назад у свої файли в папки з мого іншого проекту за допомогою Провідника Windows, потім клацнув правою кнопкою миші кожну папку в Visual Studio і зробив "Додати"> "Існуючий елемент ..." і витягнув елементи з цих папок у папки Visual Studio мого нового проекту. Я знову посилався на всі свої збірки .NET, маючи обидва проекти відкритими, щоб я міг порівняти, на які з них я посилався раніше (їх було декілька). Мені довелося назвати свій новий проект дещо іншим - в основному я зробив щось, порівнянне з "GeneralWebApp", замість "MyWebApp", наприклад, - тому мені довелося зробити "Замінити все" в усьому своєму рішенні, щоб замінити це ім'я,

Потім я зробив «Відновити всі» над проектом, а потім запустив його за допомогою кнопки «Відтворити», яку дає Visual Studio, коли я змусив його правильно побудувати. Це спрацювало нормально. Тож я опублікував його, і все було добре на сервері, де я його опублікував, коли запустив звідти. Я не маю пояснення того, що сталося, але так я це пережив. Це не поганий тест - просто перевірити, чи щось Visual Studio робить це.


1

Якщо ви розмістите лише папку bin у IIS (після побудови проекту), ця проблема також виникне. У цій ситуації слід опублікувати проект за допомогою VisualStudio, а потім розмістити опубліковану папку в IIS.


0

Що за запит HTTP ви робите?

Це трохи відповідь у лівому полі, але чи намагалися ви видалити сторінку помилок IIS за замовчуванням для 404, щоб перевірити, що насправді повертає ваш API?

У мене виникла проблема, через яку я хотів, щоб метод контролера повернув 404, коли я розмістив на ньому неправильний ідентифікатор. Я виявив, що завжди отримував сторінку IIS 404 "Файл чи каталог не знайдений", а не відповідь HTTP від ​​мого API. Видалення сторінки помилки 404 за замовчуванням вирішило проблему.

Різне питання, але ви ніколи не знаєте, що це може допомогти;)


0

Ця частина конфігурації у файлі web.config може допомогти, як мені допомогло: у розділі system.webServer:

      <security>
          <requestFiltering>
              <verbs applyToWebDAV="true">
                  <remove verb="PUT" />
                  <add verb="PUT" allowed="true" />
                  <remove verb="DELETE" />
                  <add verb="DELETE" allowed="true" />
                  <remove verb="PATCH" />
                  <add verb="PATCH" allowed="true" />
              </verbs>
          </requestFiltering>
      </security>      

0

Нещодавно у мене була помилка 404 не знайдено з усіма моїми маршрутизаторами / контролерами Web Api 2. Тому я зайшов на власне сервер і спробував переглядати, використовуючи localhost замість імені хосту, і отримав "404.7 Не знайдено - Модуль фільтрації запитів налаштований на заборону розширення файлу".

Цей SO пост допоможе мені його вирішити.


0

Це вирішилось для мене, коли я ввімкнув прапорець для UrlRoutingModule-4.0:

Менеджер IIS> Модулі> виберіть UrlRoutingModule-4.0> Редагувати модуль> встановіть прапорець «Викликати лише запити до програм ASP.NET або керованих обробників».


0

У мене була та сама проблема: на нещодавно встановленій машині з Visual Studio 2013 проект веб-api працював під IISExpress, але не під локальним IIS. Я спробував усе, що міг знайти, але врешті-решт проблема була не в Web API, а в MVC: навіть він був встановлений, жоден проект MVC не запускався.

Мені вдалося видалити IIS (з ДОДАТИ / ВИДАЛИТИ Особливості Windows), потім перевстановити його, а потім запустити aspnet_regiis -i. Можливо, це допомагає комусь іншому.


0

Я витратив багато часу, намагаючись багато речей, щоб нарешті зрозуміти, що я додаю свою веб-програму не в Сайти / Веб-сайти за замовчуванням, а в інший веб-сайт, прив'язаний до іншого порту. Очевидно, спроба localhost на порту 80 дасть 404.


0

я нічого не роблю, просто додаю цей тег у web.config, його робота над цим питанням піднімає один із наступних пунктів

  1. Використовуйте Web Api у тому самому проекті, використовуючи форми MVC або asp.net

  2. Використовуйте RouteConfig та WebApiConfig у Global.asax як GlobalConfiguration.Configure (WebApiConfig.Register); RouteConfig.RegisterRoutes (RouteTable.Routes);

  3. Використовуйте RouteConfig для 2 цілей, форми asp.net використовуйте з маршрутизацією friendlyurl та mvc для маршрутизації MVC

ми просто використовуємо цей тег у web.config, він буде працювати.

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

0

Натрапив на ту ж проблему з Web API та .Net Core Web API. Чудово працював у VS 2017 під час налагодження, але повернув 404 при публікації в IIS 7.5. Рішенням для мене було змінити спосіб створення сайту. Замість публікації в кореневій частині веб-сайту (створеного за допомогою клацання правою кнопкою миші сайтів ... Додати веб-сайт), мені довелося створити програму (створену правою кнопкою миші веб-сайту ... Додати програму) та опублікувати в цій папці. Зверніть увагу, що для базової версії мені довелося змінити параметр Версія платформи .NET Framework застосунку на "Без керованого коду".


0

Для мене рішенням було видалення наступних рядків з мого файлу 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 додав їх автоматично, не знаючи чому


0

Спробуйте цей 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.