Todas las solicitudes a ASP.NET Web API devuelven un error 404
Tengo un sitio web ASP.NET MVC 4 que incluye la API web. El sitio está desarrollado y probado con Visual Studio 2012 y .NET 4.5 en Windows 8 con IIS Express como servidor web.En este entorno de desarrollo todo funciona.
Ahora se implementa en un servidor Windows 2008 R2 (SP1) con IIS 7.5. .NET 4.0 y 4.5 están instalados. El grupo de aplicaciones se está ejecutando con .NET 4.0 en modo de canalización integrado.
En este entorno de producción, el sitio web de MVC funciona, la API web no. Para cada solicitud, no importa si GET o POST recibo un error 404. Si acabo de ingresar una URL de API web en el navegador (IE 9 abierto localmente en el servidor) para ejecutar una solicitud GET, obtengo una página 404. Si emito una solicitud POST desde una aplicación cliente de API web, también obtengo un 404 y el mensaje:
No se encontró ningún recurso HTTP que coincida con el URI de solicitud
He creado un sitio web de prueba con MVC 4 y la API web, y lo implementé en el mismo servidor y la API web funciona. Los ensamblados de la API web y MVC tienen el mismo número de versión en ambos proyectos.
Además he añadido elWeb API Route Debugger a la aplicación. Si utilizo una ruta válida comohttp://myserver/api/order/12
Obtengo el siguiente resultado:
Para mí esto significa que la plantilla de ruta correctaApi/{Controller}/{Id}
ha sido encontrado y analizado correctamente en un controladorOrder
yId=12
. El controlador (derivado deApiController
) existe en el ensamblaje web donde también están todos los controladores MVC.
Sin embargo, no sé cuál es el estado000
podría significar y por qué no se muestra la sección "Selección de ruta" (que normalmente es el caso incluso si el ensamblaje no contiene una solaApiController
, ver capturas de pantalla en la página enlazada arriba). De alguna manera parece que noApiController
se encuentra o incluso no se ha buscado o la búsqueda falla silenciosamente.
Los archivos de registro de IIS no muestran nada útil. Cambiar la configuración de varios grupos de aplicaciones y usar el mismo grupo de aplicaciones para la prueba y la aplicación real no sirvió de nada.
Actualmente estoy en el proceso de eliminar "características", ajustes de configuración, ensamblajes de terceros, etc. de la aplicación para reducir el pequeño tamaño de la aplicación de prueba al final y espero que en algún momento comience a funcionar.
¿Alguien tiene una idea de cuál podría ser el problema? También cualquier idea de depuración o registro para encontrar la razón es muy bienvenida.
Editar
Gracias al consejo de Darrel Miller en los comentarios a continuación, he integradoRastreo para ASP.NET Web Api.
Para la URL de solicitud (GET)http://myserver/api/order/12
Me sale lo siguiente:
Mensaje:http://localhost:50020/api/order/12
; Categoría: System.Web.Http.Request
Controlador de selección y creación de instancias ...
Operador: DefaultHttpControllerSelector; Operación: SelectController; Mensaje: Ruta = "controlador: orden, id: 12"; Categoría: System.Web.Http.Controllers
Operador: DefaultHttpControllerSelector; Operación: SelectController; Mensaje: Orden; Categoría: System.Web.Http.Controllers
Operador: HttpControllerDescriptor; Operación: CreateController; Mensaje:; Categoría: System.Web.Http.Controllers
Operador: DefaultHttpControllerActivator; Operación: Crear; Mensaje:; Categoría: System.Web.Http.Controllers
Operador: DefaultHttpControllerActivator; Operación: Crear; Mensaje: MyApplication.ApiControllers.OrderController; Categoría: System.Web.Http.Controllers
La selección de acciones, el enlace de parámetros y la invocación de acciones siguen ...
Negociación de contenido y formateo por resultado ...
Operador: DefaultContentNegotiator; Operación: Negociar; Mensaje: Typ = "String" ...Más
Desechando el controlador ...
Operador: OrderController; Operación: disponer; Mensaje:; Categoría: System.Web.Http.Controllers
En ambiente de producción, no exitoso. (en forma corta):Mensaje:http://myserver/api/order/12
; Categoría: System.Web.Http.Request
Operador: DefaultHttpControllerSelector; Operación: SelectController; Mensaje: Ruta = "controlador: orden, id: 12"; Categoría: System.Web.Http.Controllers
Falta toda la parte de la activación del controlador, la selección de acciones, el enlace de parámetros, la invocación de acciones y sigue la negociación de contenido y el formato para el mensaje de error inmediatamente.:
Operador: DefaultContentNegotiator; Operación: Negociar; Mensaje: Escriba = "HttpError" ...Más