Todas as solicitações para a API da Web do ASP.NET retornam erro 404
Eu tenho um site da Web ASP.NET MVC 4 que inclui a API da Web. O site é desenvolvido e testado com o Visual Studio 2012 e .NET 4.5 no Windows 8 com o IIS Express como servidor da Web.Neste ambiente de desenvolvimento tudo funciona.
Agora ele é implantado em um servidor Windows 2008 R2 (SP1) com o IIS 7.5. O .NET 4.0 e 4.5 estão instalados. O pool de aplicativos está sendo executado com o .NET 4.0 no modo de pipeline integrado.
Nesse ambiente de produção, o site do MVC funciona, o Web API não. Para cada solicitação, seja GET ou POST, recebo um erro 404. Se eu inserir um URL da API da Web no navegador (IE 9 aberto localmente no servidor) para executar uma solicitação GET, recebo uma página 404. Se eu emitir uma solicitação POST a partir de um aplicativo cliente da API da Web, também recebo um 404 e a mensagem:
Não foi encontrado nenhum recurso HTTP que corresponda ao URI do pedido
Também criei um site de teste com o MVC 4 e a API da Web e implantei-o no mesmo servidor e a API da Web funciona. Os assemblies Web API e MVC possuem o mesmo número de versão nos dois projetos.
Além disso eu adicionei oDepurador de rota da API da Web para o aplicativo. Se eu usar uma rota válida comohttp://myserver/api/order/12
Eu obtenho o seguinte resultado:
Para mim, isso significa que o modelo de rota corretoApi/{Controller}/{Id}
foi encontrado e analisado corretamente em um controladorOrder
eId=12
. O controlador (derivado deApiController
) existe na montagem da web onde também estão todos os controladores MVC.
No entanto, não sei qual é o status000
pode significar e por que não há nenhuma seção "Seleção de rota" exibida (o que é normalmente o caso mesmo se a montagem não contiverApiController
, veja capturas de tela na página vinculada acima). De alguma forma parece que nãoApiController
é encontrado ou mesmo não pesquisado ou a pesquisa falha silenciosamente.
Os arquivos de log do IIS não mostram nada útil. Alterar várias configurações do pool de aplicativos e usar o mesmo pool de aplicativos para o teste e o aplicativo real não ajudou.
No momento, estou no processo de remover "recursos", definições de configuração, montagens de terceiros, etc. do aplicativo para reduzi-lo ao tamanho pequeno do aplicativo de teste e esperar que em algum momento ele comece a funcionar.
Alguém tem uma idéia de qual seria o problema? Também qualquer idéia de depuração ou registro para encontrar a razão é muito bem vinda.
Editar
Graças à dica de Darrel Miller nos comentários abaixo eu integreiRastreamento para ASP.NET Web Api.
Para o URL de solicitação (GET)http://myserver/api/order/12
Eu recebo o seguinte:
Mensagem:http://localhost:50020/api/order/12
; Categoria: System.Web.Http.Request
Seleção e instanciação do controlador ...
Operador: DefaultHttpControllerSelector; Operação: SelectController; Mensagem: Route = "controller: order, id: 12"; Categoria: System.Web.Http.Controllers
Operador: DefaultHttpControllerSelector; Operação: SelectController; Mensagem: Ordem; Categoria: System.Web.Http.Controllers
Operador: HttpControllerDescriptor; Operação: CreateController; Mensagem: ; Categoria: System.Web.Http.Controllers
Operador: DefaultHttpControllerActivator; Operação: criar; Mensagem: ; Categoria: System.Web.Http.Controllers
Operador: DefaultHttpControllerActivator; Operação: criar; Mensagem: MyApplication.ApiControllers.OrderController; Categoria: System.Web.Http.Controllers
Seleção de ação, ligação de parâmetro e invocação de ação segue ...
Negociação e formatação de conteúdo para resultados ...
Operador: DefaultContentNegotiator; Operação: Negociar; Mensagem: Typ = "String" ...Mais
Descartando o controlador ...
Operador: OrderController; Operação: Dispose; Mensagem: ; Categoria: System.Web.Http.Controllers
Em ambiente de produção, sem sucesso (na forma abreviada):Mensagem:http://myserver/api/order/12
; Categoria: System.Web.Http.Request
Operador: DefaultHttpControllerSelector; Operação: SelectController; Mensagem: Route = "controller: order, id: 12"; Categoria: System.Web.Http.Controllers
A parte inteira da ativação do controlador, seleção de ação, ligação de parâmetro, invocação de ação está ausente e segue a negociação de conteúdo e formatação para a mensagem de erro imediatamente:
Operador: DefaultContentNegotiator; Operação: Negociar; Mensagem: Type = "HttpError" ...Mais