Página HTTP 404 no encontrada en Web Api alojada en IIS 7.5


96

Tengo una aplicación Web Api. Funciona perfectamente bien cuando lo probé con el servidor de desarrollo de depuración VS 2010. Pero ahora lo implementé en IIS 7.5 y recibo un error HTTP 404 al intentar acceder a la aplicación.

Aquí está mi 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
Tengo el mismo problema. Todavía no he encontrado una solución, sin embargo, una cosa que he descubierto es que si selecciono el sitio en IIS, luego vaya a la función Handler Mappings, hay un mapeo para archivos estáticos que se mapea * a un archivo que debe existir. Cuando elimino esta asignación y agrego una nueva asignación para todos los verbos HTTP, ya no obtengo el 404, se reemplaza por una página en blanco en blanco.
Despertar

>> utilizando el servidor de desarrollo de depuración VS 2010. - También conocido como el malvado Cassini. Consulte blogs.msdn.com/b/rickandy/archive/2011/04/22/… - Si eso no funciona, cree una nueva aplicación MVC 4 WebApi y pruebe la implementación - simple
RickAndMSFT

Respuestas:


93

Yo también estaba luchando con esto. Afortunadamente, Steve Michelotti documentó una solución que me funcionó aquí .

Al final del día, habilité todos los verbos (verbo = "*") para el controlador ExtensionlessUrlHandler-Integrated-4.0 en mi configuración web.

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

Otros han señalado que tener WebDAV habilitado causa problemas. Afortunadamente, tampoco me encontré con ese problema.


3
+1 para ese. Pero lo cambié en las asignaciones de controladores en la aplicación desde el Administrador de IIS. Se activó para un montón de verbos. Cambié eso a todos los verbos (*) y listo. Pero siempre es mejor poner la fuente.
Wolf5

1
Tengo el mismo problema, pero estos cambios no me ayudaron. ¿Existe también alguna otra configuración? ¿O puede ser una referencia de biblioteca? Consulte también: stackoverflow.com/questions/27303523/…
Babak

2
mucha gente dice que el uso de runAllManagedModulesForAllRequests afectará el rendimiento (verifique las respuestas de hemant gautam a continuación). Sin embargo, no puedo obtener el mismo servicio, así que sigo la configuración aquí: blog.maartenballiauw.be/post/2012/12/07/… Ese enlace también señala que habilitar WebDAV también puede afectar el resultado
Hoàng Long

¡Respuesta impresionante!
EnocNRoll - AnandaGopal Pardue

1
Para mí, el verbo ya estaba *. También tuve que cambiar la ruta para *que funcionara, ya que *.todavía causaba el problema
Alsty

56

Tenía el mismo problema. Este ajuste de configuración resolvió el problema.

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

Como se explica en http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html , se debe evitar la solución anterior. Use esto en su lugar. Lopsided también proporciona la misma solución. Manteniéndolo aquí para que los usuarios eviten implementar la primera solución de trabajo.

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

Funciona bien, pero no es una muy buena solución. Es mejor usar UrlRoutingModule (vea la respuesta de Lopsided a continuación). britishdeveloper.co.uk/2010/06/…
Der_Meister

37

Si IIS está instalado o habilitado después de ASP.NET, deberá registrar manualmente ASP.NET con IIS para que su aplicación .NET funcione.

Para Windows 7 y versiones anteriores:

  1. Ejecute el símbolo del sistema (cmd.exe) como administrador.
  2. Navegue hasta la ubicación de .NET Framework adecuada. (por ejemplo, C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319)
  3. Ejecute aspnet_regiis.exe -i

Para Windows 8 y posterior:

  1. En el menú de inicio, escriba "Activar o desactivar las funciones de Windows" y seleccione el primer resultado.
  2. Expanda Servicios de información de Internet: Servicios World Wide Web: Funciones de desarrollo de aplicaciones y seleccione ASP.NET 4.5 (o ASP.NET 3.5 si necesita admitir proyectos en .NET Framework 2.0-3.5).
  3. Haga clic en Aceptar.

2
Migré de IIS Express para el desarrollo a IIS completo y esto es lo que lo solucionó. ¡Gracias!
Jim Brown

1
Similar a @JimBrown arriba; funcionó para mí después de migrar desde IIS express.
SolidRegardless

Esto lo resolvió para mí. En Windows 7, Visual Studio 2015 Ent, el nuevo sitio web de MVC 5, cambió de IIS Express a IIS completo.
Geoff Gunter

26

¿Está ejecutando la aplicación Web API en un directorio virtual o una aplicación?

Por ejemplo: tuve el mismo problema cuando moví mi proyecto a mi IIS local en Sitio web predeterminado> SampleWebAPI. Creo que esto se debe al cambio en elURL enrutamiento de la siguiente manera:

Original: localhost:3092/api/values
Movido: localhost/SampleWebAPI/api/values

Si mueve el proyecto de API web a su propio sitio web que se ejecuta en un puerto diferente, parece que funciona.

Nota adicional: había complicado aún más el problema agregando apicomo el alias de una aplicación dentro de mi sitio web que causó el efectoURL fuera:

localhost:81/api/api/values - noté esto después de mover el sitio web a su propio sitio web

Por lo tanto, debido a que quería mantener una separación entre mi sitio web y el sitio del proyecto web api mvc, cambié las reglas de enrutamiento global.asaxpara la API web "DefaultAPI" de api/{controller}/{id}a {controller}/{id}y ASP.NET MVC una Defaultde {controller}/{id}a info/{controller}/{id}.


3
jejeje ... me había llamado mi aplicación en la IISque apitambién. Esto provocó toda esta depuración de prueba y error durante más de 2 horas. ¡Muchas gracias por compartir tu experiencia! Se le cambió el nombre y ahora estoy de vuelta en el negocio. : D
Leniel Maccaferri

Gracias, ¡este fue mi problema! :)
Jen

No estoy seguro de por qué fallaron las llamadas a la API cuando alojé mi proyecto en un puerto 8080, simplemente moverlo como un directorio virtual en el sitio web predeterminado funcionó :)
Kiran

14

Esta es la única respuesta que funcionó para mí ...

Tuve un problema similar ... Parecía que no importaba lo que hiciera, nada se redirigía y mi archivo global simplemente estaba siendo ignorado. Consideré seriamente terminar con todo antes de encontrar esta respuesta. Espero que este enlace ayude a alguien más.


Agregar lo siguiente al archivo web.config funcionó para mí:

<system.webServer>
  <modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  </modules>
</system.webServer>

La etiqueta system.webServer ya estaba allí, por supuesto, pero le agregué la etiqueta de módulos y luego la etiqueta de quitar y agregar a los módulos.


Solucione este problema en un servidor 2008 (no R2), y esta fue la única solución que funcionó para mí. Además, tuve que combinar esto con configurar el grupo de aplicaciones en modo "integrado".
Zoomzoom

11

Algunas cosas para comprobar:

  1. Asegúrese de tener instalado .NET Framework 4.
  2. Asegúrese de que la versión 4 de .NET Framework esté seleccionada para su sitio web y directorio virtual (si corresponde).
  3. Asegúrese de tener MVC instalado o tener las DLL adecuadas en su directorio bin.
  4. Es posible que deba permitir extensiones de servicio web ASP.NET 4.0
  5. Coloque la aplicación en su propio grupo de aplicaciones.
  6. Asegúrese de que el directorio tenga al menos permisos de ejecución "Sólo secuencias de comandos".

Tengo otras 4 aplicaciones web normales que se ejecutan en el mismo servidor IIS y todas usan .net framework 4. ¿Cuál de esos 4 puntos no es necesario? cuando publiqué mi aplicación mvc agregué agregar dependencias implementables y agregué ASP.NET MVC para que esté en mi directorio bin
Armand

@Armand Parece que has hecho el # 1. El # 2 sigue siendo necesario. Agregar dependencias implementables, si lo hizo como se describe aquí: haacked.com/archive/2011/05/25/bin-deploying-asp-net-mvc-3.aspx , debe ocuparse del # 3 anterior. El número 4 puede ser necesario o no, aunque no tengo el conocimiento para decirte cuándo es y no es necesario.
Joe Schrag

9

Tuve un problema similar. Tenía la configuración correcta en mi archivo web.config pero estaba ejecutando el grupo de aplicaciones en el modo clásico en lugar del modo integrado

captura de pantalla


7

Este problema también puede ocurrir debido a lo siguiente

1.En Web.Config

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

2.Asegúrese de que lo siguiente esté disponible en la carpeta bin del servidor donde se implementa la API web

  • System.Net.Http

  • System.Net.Http.Formatting

  • System.Web.Http.WebHost

  • System.Web.Http

Estos ensamblados no se copiarán en la carpeta bin de forma predeterminada si la publicación se realiza a través de Visual Studio porque los paquetes de API web se instalan a través de Nuget en la máquina de desarrollo. Aún así, si desea que estos archivos estén disponibles como parte de la publicación de Visual Studio, debe establecer CopyLocal en True para estos ensamblados

Sadish Kumar.V


Esas DLL son necesarias si no tiene MVC instalado en el servidor. En mi caso, estaba viendo una página en blanco al intentar invocar las API. Agregar la DLL manualmente funcionó para mí. ¡¡Gracias!!
Vipul bhojwani

Mi problema se resolvió después de agregar System.Net.Http a la carpeta de publicación principal, el mío fue la solución Asp.net Core
mohas

6

En base a esta respuesta, así , sólo tenía que cambiar path="*."para path="*"el agregado ExtensionlessUrlHandler-Integrated-4.0deconfiguration>system.WebServer>handlers miweb.config

Antes de:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Después:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Muchas gracias Greg, estaba a punto de matarme por este estúpido camino = "*". pero ahora, después de dejar caer este miserable punto, ¡todo funciona perfectamente bien! ¡Muchas gracias!
Junior Silva

5

También me encontré con este problema. Resolví el problema yendo a Grupos de aplicaciones> Nombre del grupo de aplicaciones y cambié .NET Framework de la versión v.2.0.50727 a v4.0.30319.


1
También descubrí esto por mi cuenta. Vota tu respuesta porque es fácil pasarla por alto. Cuando creé un sitio para mi aplicación, IIS creó automáticamente un grupo de aplicaciones para mí, configurado en .NET v2.0 !! ¿Por qué, por qué, por qué? :)
Mike Taverne

3

Tuve que deshabilitar la opción de publicación de archivos "Precompilar durante la publicación".


¿Y dónde haces eso?
vapcguy

1
Está en un cuadro de diálogo que aparece cuando hace clic con el botón derecho en el proyecto y selecciona Publicar. Parece que esta
Pakman

3

Hay una solución oficial de microsoft: http://support.microsoft.com/kb/980368

NO recomiendo encarecidamente utilizar <módulos runAllManagedModulesForAllRequests = "true">. Esto hace que todas las solicitudes (incluso .jpg, .css, .pdf, etc.) sean procesadas por todos los módulos HTTP registrados. Hay dos momentos negativos: a) carga adicional en los recursos de hardware; b) posibles errores, ya que los módulos http procesarán un nuevo tipo de contenido.


1
Gracias por lo tanto! Probé absolutamente todo lo demás, y esto fue lo único que lo solucionó.
Oran Dennison

Lo mismo aquí, ¡muchas gracias por agregar esta respuesta! ¡Fue la solución para mi problema!
Octavio Garbarino

2

Comencé a recibir respuestas 404 de Web API después de seguir un tutorial de Windows Azure que me decía que agregara un archivo "WebRole.cs" a mi proyecto.

Después de eliminar "WebRole.cs" de mi proyecto, mis llamadas a la API web comenzaron a funcionar nuevamente.


Esto funcionó para mí. Migré una aplicación de Azure de nuevo a una implementación de VM y, después de comentar el contenido de WebRole.cs, mis llamadas de WebAPI comenzaron a funcionar nuevamente.
Scott

¡Debo haber pasado un día en esto! Comentar WebRole.cs funcionó - me pregunto por qué sin embargo
Igorek

2

Asegúrese de que el grupo de aplicaciones esté en modo integrado
y agregue lo siguiente al archivo web.config:

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

2

En mi caso, el problema era simplemente que estaba intentando acceder al sitio en

myserver.myintranet.com/mysite

Pero el enlace del sitio web para http en IIS no tenía el nombre de host especificado en el enlace. Había funcionado antes y no tengo ni idea de cómo quedó impresionado.

Una vez que puse myserver.myintranet.com el nombre de host, el 404 desapareció.

En el Administrador de IIS, acceda a Enlaces ... en el panel de acciones, luego edite el enlace http para especificar el nombre de host.


Incluso yo también estoy enfrentando el mismo problema. y como sugirió, verifiqué el nombre de host en el enlace http, y solo se actualizó correctamente. Pero aún persiste mi problema. Nota: alojé mi aplicación API como una aplicación secundaria. Por favor sugiera si alguien tiene alguna idea sobre esto. ej .: "sample.example.com" es mi aplicación principal y he creado una API bajo este dominio como "sample.example.com/myAPI/"
Krishna Mani


1

Tuve el mismo problema, una respuesta 404 para los controladores de la API web cuando se sirvió desde IIS, pero todo funcionó bien desde VS2010. Ninguna de las soluciones anteriores funcionó para mí. Finalmente, descubrí que el problema era que agregamos soporte WSE 3.0 para la aplicación y faltaba el dll Microsoft.Web.Services3 en el directorio / bin de la aplicación. Extraño, pero después de copiar el dll, el mapeo de rutas comenzó a funcionar.


1

Para mí, el problema era que el sitio raíz estaba configurado para usar un grupo de aplicaciones .NET 2.0, y mi aplicación dentro de ese sitio era .NET 4.5.

Creé un nuevo sitio con un grupo de aplicaciones .NET 4 y coloqué mi aplicación en la raíz de eso, y funcionó bien.


1

Yo también luché con esto. Mi problema exacto era que tenía un servicio web ASMX que, cuando ingresaba un parámetro en un método web y lo probaba, me daba el 404. El método en particular había funcionado bien en el pasado y no se había cambiado. solo reeditado. Luego llegué aquí y probé todas las respuestas publicadas y nada ayudó.

¿Mi solución definitiva? Sé que esto es drástico, pero acabo de crear una nueva solución de Visual Studio y un proyecto web. Seleccioné MVC, luego hice un "Agregar"> "Nuevo elemento", seleccioné "Visual C #"> "Web" y "Servicio web (ASMX)" debajo de eso. Copié todo mi código anterior de código subyacente, luego tomé nota del espacio de nombres que le dio al nuevo archivo en mi nuevo proyecto, luego pegué todo mi código anterior en el nuevo archivo de código subyacente en el nuevo proyecto y puse el espacio de nombres volver a lo que había sido.

Luego creé mis carpetas en mi proyecto que tenía antes de usar Visual Studio para hacer "Agregar"> "Nueva carpeta", luego copié de nuevo mis archivos en las carpetas de mi otro proyecto usando el Explorador de Windows, luego hice clic derecho en cada carpeta en Visual Studio e hizo "Agregar"> "Elemento existente ..." y sacó los elementos de esas carpetas en las carpetas de Visual Studio de mi nuevo proyecto. Hice referencia a todos mis ensamblados .NET nuevamente, teniendo ambos proyectos abiertos para poder comparar a cuáles había hecho referencia anteriormente (había varios). Tuve que nombrar mi nuevo proyecto un poco diferente, básicamente hice algo comparable a "GeneralWebApp" en lugar de "MyWebApp", por ejemplo, así que tuve que hacer un "Reemplazar todo" en toda mi solución para reemplazar ese nombre,

Luego hice un "Reconstruir todo" en el proyecto, luego lo inicié con el botón "Reproducir" que Visual Studio da cuando logré que se compile correctamente. Funcionó bien. Entonces lo publiqué, y todo estaba bien en el servidor donde lo publiqué, cuando lo ejecuté desde allí. No tengo una explicación de lo que pasó, pero así fue como lo supere. No es una mala prueba solo para ver si algo que está haciendo Visual Studio lo ha estropeado.


1

Si coloca solo la carpeta bin en IIS (después de construir el proyecto), este problema también ocurrirá. En esta situación, debe publicar el proyecto con VisualStudio y luego colocar la carpeta publicada en IIS.


0

¿Qué tipo de solicitud HTTP está realizando?

Esta es una respuesta ligeramente del campo izquierdo, pero ¿ha intentado eliminar la página de error predeterminada de IIS para 404 para verificar lo que su API realmente está devolviendo?

Tuve un problema por el cual quería que un método de controlador devolviera un 404 cuando publiqué la identificación incorrecta. Descubrí que siempre obtenía la página "Archivo o directorio no encontrado" de IIS 404 en lugar de la respuesta HTTP de mi API. La eliminación de la página de error 404 predeterminada resolvió el problema.

Problema diferente, pero nunca se sabe que puede ayudar;)


0

Esta pieza de configuración en el archivo web.config puede ayudarme a mí: en la sección 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

Recientemente tuve un error 404 no encontrado con todas mis rutas / controladores de Web Api 2. Así que fui al servidor real e intenté navegar usando localhost en lugar del nombre de host y obtuve "404.7 Not Found - El módulo de filtrado de solicitudes está configurado para denegar la extensión del archivo".

Esta publicación SO me ayuda a resolverlo.


0

Se resolvió para mí, cuando habilito la casilla de verificación para UrlRoutingModule-4.0:

Administrador de IIS> Módulos> seleccione UrlRoutingModule-4.0> Editar módulo> marque la casilla de verificación "Invocar solo para solicitudes de aplicaciones ASP.NET o controladores administrados".


0

Tuve el mismo problema: en una máquina recién instalada con Visual Studio 2013, el proyecto de la API web funcionaba con IISExpress, pero no con IIS local. Intenté todo lo que pude encontrar, pero al final el problema no era necesario con la API web, sino con MVC: incluso estaba instalado, no se estaba ejecutando ningún proyecto MVC.

Lo que funcionó para mí fue desinstalar IIS (de ADD / REMOVE Windows Features), luego reinstalarlo y luego ejecutar aspnet_regiis -i. Quizás esto ayude a alguien más.


0

Pasé mucho tiempo probando muchas cosas para finalmente darme cuenta de que estaba agregando mi aplicación web no en Sitios / Sitios web predeterminados, sino en otro sitio web vinculado a otro puerto. Obviamente, probar localhost en el puerto 80 daría un 404.


0

No hago nada, solo agregue esta etiqueta en web.config, está funcionando, este problema surge uno de los siguientes puntos

  1. Use Web Api en el mismo proyecto usando formularios MVC o asp.net

  2. Utilice RouteConfig y WebApiConfig en Global.asax como GlobalConfiguration.Configure (WebApiConfig.Register); RouteConfig.RegisterRoutes (RouteTable.Routes);

  3. Use RouteConfig para 2 propósitos, formularios asp.net con enrutamiento friendlyurl y mvc para enrutamiento MVC

solo usamos esta etiqueta en web.config, funcionará.

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

0

Se encontró con el mismo problema con Web API y .Net Core Web API. Funcionó bien en VS 2017 durante la depuración, pero devolvió 404 cuando se publicó en IIS 7.5. La solución para mí fue cambiar la forma en que creé el sitio. En lugar de publicar en la raíz de un sitio web (creado haciendo clic derecho en Sitios ... Agregar sitio web), tuve que crear una aplicación (creada haciendo clic derecho en un sitio web ... Agregar aplicación) y publicar en esa carpeta. Tenga en cuenta que para la versión Core, tuve que cambiar la configuración de Application Pool .NET Framework Version a "No Managed Code".


0

Para mí, la solución fue eliminar las siguientes líneas de mi archivo 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>

Noté que VS los había agregado automáticamente, no estoy seguro de por qué


0

Pruebe este webconfg .. reemplace "NewsApi.dll" con su dll principal!


<?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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.