Página HTTP 404 não encontrada na API da Web hospedada no IIS 7.5


96

Tenho um aplicativo Web Api. Funcionou perfeitamente bem quando o testei usando o servidor de desenvolvimento de depuração VS 2010. Mas agora eu o implantei no IIS 7.5 e estou recebendo um erro HTTP 404 ao tentar acessar o aplicativo.

Aqui está meu 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
Eu tenho o mesmo problema. Ainda não encontrei uma solução, porém uma coisa que descobri é que, se selecionar o site no IIS, vá para o recurso Handler Mappings, há um mapeamento para arquivos estáticos que mapeia * para um arquivo que deve existir. Quando removo esse mapeamento e adiciono um novo mapeamento para todos os verbos HTTP, não recebo mais o 404, ele é substituído por uma página em branco.
Despertar

>> usando o servidor de desenvolvimento de depuração VS 2010. - Também conhecido como o mal Cassini. Consulte blogs.msdn.com/b/rickandy/archive/2011/04/22/… - Se isso não funcionar, crie um novo aplicativo MVC 4 WebApi e teste a implantação - simples
RickAndMSFT

Respostas:


93

Eu também estava lutando contra isso. Felizmente, Steve Michelotti documentou uma solução que funcionou para mim aqui .

No final do dia, habilitei todos os verbos (verbo = "*") para o manipulador ExtensionlessUrlHandler-Integrated-4.0 em minha configuração da 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>

Outros apontaram que ter o WebDAV habilitado causa problemas. Felizmente, também não tive esse problema.


3
1 para aquele. Mas eu mudei nos Mapeamentos do manipulador no aplicativo com o Gerenciador do IIS. Foi ativado para um monte de verbos. Mudei isso para todos os verbos (*) e voila. Mas é sempre melhor colocar a fonte.
Wolf5

1
Tenho o mesmo problema, mas essas mudanças não me ajudaram. Existe alguma outra configuração também? Ou pode ser uma referência de biblioteca? Consulte também: stackoverflow.com/questions/27303523/…
Babak

2
muitas pessoas dizem que o uso de runAllManagedModulesForAllRequests afetará o desempenho (verifique as respostas de hemant gautam abaixo). No entanto, não consigo fazer com que o mesmo serviço funcione, então sigo a configuração aqui: blog.maartenballiauw.be/post/2012/12/07/… Esse link também indica que a ativação do WebDAV também pode afetar o resultado
Hoàng Long

Resposta incrível!
EnocNRoll - AnandaGopal Pardue

1
Para mim, o verbo já era *. Tive que alterar o caminho para *também para fazê-lo funcionar, pois *.ainda causava o problema
Alsty

56

Teve o mesmo problema. Esta definição de configuração resolveu o problema.

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

Conforme explicado em http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html, a solução acima deve ser evitada. Use isso. A mesma solução é fornecida pela Lopsided também. Mantendo-o aqui para permitir que os usuários evitem implementar a primeira solução de trabalho.

<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 bem, mas não é uma solução muito boa. É melhor usar UrlRoutingModule (veja a resposta de Lopsided abaixo). britishdeveloper.co.uk/2010/06/…
Der_Meister

37

Se o IIS for instalado ou ativado após o ASP.NET, você precisará registrar manualmente o ASP.NET com o IIS para que seu aplicativo .NET funcione.

Para Windows 7 e anterior:

  1. Execute o Prompt de Comando (cmd.exe) como administrador.
  2. Navegue até o local apropriado do .NET Framework. (por exemplo, C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319)
  3. Execute aspnet_regiis.exe -i

Para Windows 8 e posterior:

  1. No menu iniciar, digite "Ativar ou desativar recursos do Windows" e selecione o primeiro resultado.
  2. Expanda Serviços de Informações da Internet: Serviços da World Wide Web: Recursos de Desenvolvimento de Aplicativos e selecione ASP.NET 4.5 (ou ASP.NET 3.5 se você precisar oferecer suporte a projetos no .NET Framework 2.0-3.5).
  3. Clique OK.

2
Migrei do IIS Express para desenvolvimento para o IIS completo e foi isso que consertou para mim. Obrigado!
Jim Brown

1
Semelhante ao @JimBrown acima; funcionou para mim depois de migrar do IIS Express.
SolidRegardless de

Isso resolveu para mim. No Windows 7, o Visual Studio 2015 Ent, novo site MVC 5, mudou de IIS Express para IIS completo.
Geoff Gunter

26

Você está executando o aplicativo Web API em um diretório virtual ou um aplicativo?

Por exemplo: Tive o mesmo problema quando movi meu projeto para o IIS local em Default Web Site> SampleWebAPI. Acredito que isso se deva à mudança no URLroteamento da seguinte forma:

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

Se você mover o projeto de API da Web para seu próprio site em execução em uma porta diferente, ele parece funcionar.

Observação adicional: compliquei ainda mais o problema adicionando apicomo o alias de um aplicativo em meu site que fazia com que o efetivo URLfosse:

localhost:81/api/api/values - percebi isso depois de mover o site para seu próprio site

Portanto, como eu queria manter uma separação entre meu site e o site do projeto web api mvc, alterei as regras de roteamento global.asaxda API Web "DefaultAPI" de api/{controller}/{id}para {controller}/{id}e da ASP.NET MVC Defaultde {controller}/{id}para info/{controller}/{id}.


3
hehehe ... eu tinha chamado meu aplicativo em IIScomo apitambém. Isso causou toda essa depuração de tentativa e erro por mais de 2 horas. Muito obrigado por compartilhar sua experiência! Renomeou e agora estou de volta ao trabalho novamente. : D
Leniel Maccaferri

Obrigado - esse era o meu problema! :)
Jen

Não tenho certeza por que as chamadas de API estavam falhando quando hospedei meu projeto em uma porta 8080, apenas movê-lo como um diretório virtual no site padrão fez o truque :)
Kiran

14

Esta é a única resposta que funcionou para mim ...

Eu tive um problema semelhante ... Parecia que, independentemente do que eu fizesse, nada estava sendo redirecionado e meu arquivo global estava apenas sendo ignorado. Eu considerei seriamente terminar tudo antes de encontrar essa resposta. Espero que este link ajude mais alguém.


Adicionar o seguinte ao arquivo web.config funcionou para mim:

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

A tag system.webServer já estava lá, é claro, mas eu adicionei a tag modules a ela e, em seguida, remova e adicione tags à tag de módulos.


Encontre este problema em um servidor de 2008 (não R2), e esta foi a única solução que funcionou para mim. Além disso, tive que combinar isso com a configuração do pool de aplicativos no modo "integrado".
Zoomzoom

11

Algumas coisas para verificar:

  1. Certifique-se de ter o .NET Framework 4 instalado.
  2. Certifique-se de que a versão 4 do .NET Framework esteja selecionada para o seu site e diretório virtual (se aplicável).
  3. Certifique-se de ter instalado o MVC ou as DLLs apropriadas em seu diretório bin.
  4. Pode ser necessário permitir extensões de serviço da web ASP.NET 4.0
  5. Coloque o aplicativo em seu próprio pool de aplicativos.
  6. Certifique-se de que o diretório tenha pelo menos permissões de execução "Somente scripts".

Eu tenho 4 outros aplicativos da web normais em execução no mesmo servidor IIS e todos eles estão usando o .net framework 4. então, qual desses 4 pontos não é necessário? quando publiquei meu aplicativo mvc, adicionei as dependências implantáveis ​​adicionadas e adicionei a ASP.NET MVC para que esteja no meu diretório bin
Armand

@Armand Parece que você alcançou o primeiro lugar. # 2 ainda é necessário. Adicionar dependências implantáveis, se você fez conforme descrito aqui: haacked.com/archive/2011/05/25/bin-deploying-asp-net-mvc-3.aspx , deve cuidar do nº 3 acima. # 4 pode ou não ser necessário, embora eu não tenha o conhecimento para dizer quando é e não é necessário.
Joe Schrag

9

Eu tive um problema parecido. Eu tinha as configurações corretas no meu arquivo web.config, mas estava executando o pool de aplicativos no modo Clássico em vez do modo Integrado

captura de tela


7

Esse problema também pode ocorrer devido ao seguinte

1. No Web.Config

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

2. Certifique-se de que o seguinte esteja disponível na pasta bin no servidor onde a API da Web está implementada

  • System.Net.Http

  • System.Net.Http.Formatting

  • System.Web.Http.WebHost

  • System.Web.Http

Esses assemblies não serão copiados na pasta bin por padrão se a publicação for por meio do Visual Studio, porque os pacotes de API da Web são instalados por meio do Nuget na máquina de desenvolvimento. Ainda assim, se você deseja que esses arquivos estejam disponíveis como parte da publicação do Visual Studio, você precisa definir CopyLocal como True para esses assemblies

Sadish Kumar.V


Essas DLLs são necessárias se você não tiver o MVC instalado no servidor. No meu caso, estava vendo uma página em branco ao tentar invocar a API. Adicionar a DLL manualmente funcionou para mim. Obrigado!!
Vipul bhojwani

Meu problema foi resolvido depois de adicionar System.Net.Http à pasta de publicação principal, o meu foi a solução Asp.net Core
mohas

6

Com base nesta resposta SO , eu só tive que mudar path="*."para path="*"para o agregado ExtensionlessUrlHandler-Integrated-4.0em configuration>system.WebServer>handlersna minhaweb.config

Antes:

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

Depois de:

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

Muito obrigado Greg, eu estava prestes a me matar por causa deste caminho estúpido = "*." mas agora, depois de soltar este ponto miserável, tudo funciona perfeitamente bem! Muito obrigado!
Junior Silva

5

Eu também tive esse problema. Resolvi o problema acessando Pools de aplicativos> Nome do pool de aplicativos e alterei o .NET Framework da versão v.2.0.50727 para v4.0.30319.


1
Eu descobri isso sozinho também. Votar positivamente em sua resposta porque é fácil perder. Quando criei um site para meu aplicativo, o IIS criou automaticamente um pool de aplicativos para mim, definido como .NET v2.0 !! Porque porque porque?? :)
Mike Taverne

3

Tive que desabilitar a opção de publicação de arquivo "Pré-compilar durante a publicação".


E onde você faz isso?
vapcguy

1
Ele está em uma caixa de diálogo que aparece quando você clica com o botão direito do mouse no projeto e seleciona Publicar. Parece que este
Pakman

3

Existe uma correção oficial da microsoft: http://support.microsoft.com/kb/980368

NÃO recomendo enfaticamente o uso de <modules runAllManagedModulesForAllRequests = "true">. Isso faz com que todas as solicitações (mesmo .jpg, .css, .pdf, etc) sejam processadas por todos os módulos HTTP registrados. Existem dois momentos negativos: a) carga adicional nos recursos de hardware; b) possíveis erros, pois os módulos http irão processar novo tipo de conteúdo.


1
Obrigado tão muito! Tentei absolutamente tudo o mais, e essa foi a única coisa que consertou.
Oran Dennison

Mesmo aqui, muito obrigado por adicionar esta resposta! Foi a solução para o meu problema!
Octavio Garbarino de

2

Comecei a obter respostas 404 da API Web depois de seguir um tutorial do Windows Azure que me disse para adicionar um arquivo "WebRole.cs" ao meu projeto.

Depois de remover "WebRole.cs" do meu projeto, minhas chamadas de API da Web começaram a funcionar novamente.


Isso funcionou para mim. Migrei um aplicativo do Azure de volta para uma implantação de VM e depois de comentar o conteúdo de WebRole.cs, minhas chamadas WebAPI começaram a funcionar novamente.
Scott

Devo ter passado um dia nisso! Comentar WebRole.cs funcionou - pergunto por que, no entanto
Igorek

2

Certifique-se de que o pool de aplicativos esteja no modo integrado
e adicione o seguinte ao arquivo web.config:

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

2

No meu caso, o problema era simplesmente que eu estava tentando acessar o site em

myserver.myintranet.com/mysite

Mas a associação do site para http no IIS não tinha o nome do host especificado na associação. Tinha funcionado antes e eu não tenho ideia de como isso explodiu.

Uma vez que eu coloquei myserver.myintranet.com o nome do host, o 404 havia desaparecido.

No Gerenciador do IIS, você vai para Ligações ... no painel de ações e edita a ligação http para especificar o nome do host.


Mesmo eu também estou enfrentando o mesmo problema. e como você sugeriu, verifiquei o nome do host na ligação http, e ele foi atualizado apenas corretamente. Mas ainda assim meu problema persiste. Nota: Eu hospedei meu aplicativo API como um aplicativo filho. Por favor, sugira se alguém tem ideia sobre isso. ex: "sample.example.com" é meu aplicativo principal e criei uma API neste domínio como "sample.example.com/myAPI/"
Krishna Mani,


1

Tive o mesmo problema, uma resposta 404 para os controladores da API da web quando servidos a partir do IIS, mas tudo funcionou bem no VS2010. Nenhuma das soluções acima funcionou para mim. Acabei descobrindo que o problema era que adicionamos o suporte WSE 3.0 para o aplicativo e a dll Microsoft.Web.Services3 estava faltando no diretório / bin do aplicativo. Estranho, mas depois de copiar a dll, o mapeamento de rotas começou a funcionar.


1

Para mim, o problema era que o site raiz foi configurado para usar um pool de aplicativos .NET 2.0, e meu aplicativo dentro desse site era .NET 4.5.

Eu criei um novo site com um pool de aplicativos .NET 4 e coloquei meu aplicativo na raiz - e funcionou bem.


1

Eu lutei com isso também. Meu problema exato era que eu tinha um ASMX Web Service que, quando inseri um parâmetro em um método da web e o testei, ele me deu o 404. O método específico funcionou bem no passado e não foi alterado, apenas republicado. Então eu cheguei aqui e tentei todas as respostas postadas e nada ajudou.

Minha solução final? Eu sei que isso é drástico, mas acabei de criar uma nova solução do Visual Studio e um projeto da web. Selecionei MVC, então fiz um "Add"> "New Item", selecionei "Visual C #"> "Web" e "Web Service (ASMX)" abaixo disso. Copiei todo o meu código code-behind antigo, anotei o namespace fornecido ao novo arquivo em meu novo projeto, colei todo o meu código antigo no novo arquivo code-behind no novo projeto e coloquei o namespace de volta ao que tinha sido.

Em seguida, criei minhas pastas em meu projeto que tinha antes de usar o Visual Studio para fazer "Adicionar"> "Nova pasta", copiei de volta em meus arquivos para as pastas de meu outro projeto usando o Windows Explorer e cliquei com o botão direito em cada pasta em O Visual Studio fez "Adicionar"> "Item Existente ..." e puxou os itens dessas pastas para as pastas do Visual Studio do meu novo projeto. Referenciei todos os meus assemblies .NET novamente, tendo ambos os projetos abertos para que eu pudesse comparar aqueles que havia referenciado anteriormente (havia vários). Tive que nomear meu novo projeto um pouco diferente - basicamente fiz algo comparável a "GeneralWebApp" em vez de "MyWebApp", por exemplo - então tive que fazer um "Substituir tudo" em toda a minha solução para substituir esse nome,

Então eu fiz um "Rebuild All" no projeto, em seguida, iniciei com o botão "Play" que o Visual Studio fornece quando eu o construo corretamente. Funcionou bem. Então eu publiquei e estava tudo bem no servidor onde eu publiquei, quando eu executei de lá. Não tenho explicação sobre o que aconteceu, mas foi assim que consegui superar. Não é um teste ruim apenas para ver se algo que o Visual Studio está fazendo estragou tudo.


1

Se você colocar apenas a pasta bin no IIS (após a construção do projeto), este problema também ocorrerá. Nessa situação, você deve publicar o projeto usando o VisualStudio e, em seguida, colocar a pasta publicada no IIS.


0

Que tipo de solicitação HTTP você está fazendo?

Esta é uma resposta um pouco à esquerda, mas você já tentou remover a página de erro padrão do IIS para 404 para verificar o que sua API está realmente retornando?

Tive um problema em que queria que um método de controlador retornasse um 404 quando postei a id incorreta nele. Descobri que sempre recebia a página "Arquivo ou diretório não encontrado" do IIS 404, em vez da resposta HTTP da minha API. Remover a página de erro 404 padrão resolveu o problema.

Problema diferente, mas você nunca sabe, pode ajudar;)


0

Este pedaço de configuração no arquivo web.config pode me ajudar conforme me ajudou: na seção 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

Recentemente, tive um erro 404 não encontrado com todas as minhas rotas / controladores Web Api 2. Então, entrei no servidor real e tentei navegar usando localhost em vez do nome do host e obtive "404.7 Not Found - O módulo de filtragem de solicitações está configurado para negar a extensão do arquivo".

Este post me ajuda a resolver isso.


0

Foi resolvido para mim, quando eu habilito a caixa de seleção para UrlRoutingModule-4.0:

Gerenciador do IIS> Módulos> selecione UrlRoutingModule-4.0> Editar Módulo> marque a caixa de seleção "Chamar apenas para solicitações de aplicativos ASP.NET ou manipuladores gerenciados".


0

Eu tive o mesmo problema: em uma máquina recém-instalada com o Visual Studio 2013, o projeto da API da web estava trabalhando no IISExpress, mas não no IIS local. Tentei de tudo que pude encontrar, mas no final o problema não era necessário com a API Web, mas com o MVC: mesmo instalado, nenhum projeto MVC estava rodando.

O que funcionou para mim foi desinstalar o IIS (em ADD / REMOVE Windows Features), reinstalá-lo e executar aspnet_regiis -i. Talvez isso ajude outra pessoa.


0

Passei muito tempo tentando várias coisas para finalmente perceber que estava adicionando meu aplicativo da web não em Sites / Sites padrão, mas em outro site vinculado a outra porta. Obviamente, tentar localhost na porta 80 resultaria em 404.


0

Eu não faço nada, apenas adiciono esta tag no web.config, está funcionando. Esse problema surge em um dos seguintes pontos

  1. Use Web Api no mesmo projeto usando formulários MVC ou asp.net

  2. Use RouteConfig e WebApiConfig em Global.asax como GlobalConfiguration.Configure (WebApiConfig.Register); RouteConfig.RegisterRoutes (RouteTable.Routes);

  3. Use RouteConfig para 2 finalidades, formulários asp.net usando com friendlyurl e roteamento mvc para roteamento MVC

acabamos de usar essa tag no web.config, vai funcionar.

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

0

Teve o mesmo problema com a API Web e a API Web .Net Core. Funcionou bem no VS 2017 durante a depuração, mas retornou 404 quando publicado no IIS 7.5. A solução para mim foi mudar a forma como criei o site. Em vez de publicar na raiz de um site (criado clicando com o botão direito em Sites ... Adicionar site), tive que criar um aplicativo (criado clicando com o botão direito em um site ... Adicionar aplicativo) e publicá-lo nessa pasta. Observe que, para a versão Core, tive que alterar a configuração da versão do .NET Framework do pool de aplicativos para "Nenhum código gerenciado".


0

Para mim, a solução foi remover as seguintes linhas do meu arquivo 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>

Percebi que o VS os adicionou automaticamente, não sei por que


0

Tente este webconfg .. substitua "NewsApi.dll" por sua 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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.