在IIS 7.5中托管的Web Api中找不到HTTP 404页面

时间:2012-03-14 13:37:32

标签: c# asp.net-web-api iis-7.5 http-status-code-404

我有一个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>

34 个答案:

答案 0 :(得分:86)

我也在努力解决这个问题。幸运的是,Steve Michelotti记录了一个对我有用的解决方案here

在一天结束时,我在web配置中启用了所有动词(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会导致问题。幸运的是,我也没有遇到过这个问题。

答案 1 :(得分:52)

有同样的问题。此配置设置解决了该问题。

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

答案 2 :(得分:33)

如果在ASP.NET之后安装或启用了IIS,则需要手动向IIS注册ASP.NET,以便.NET应用程序正常工作。

对于Windows 7及更早版本:

  1. 以管理员身份运行命令提示符(cmd.exe)。
  2. 导航到相应的.NET Framework位置。 (例如C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319)
  3. 运行aspnet_regiis.exe -i
  4. 对于Windows 8及更高版本:

    1. 从开始菜单中,键入“打开或关闭Windows功能”并选择第一个结果。
    2. 展开Internet信息服务:万维网服务:应用程序开发功能并选择ASP.NET 4.5(如果需要支持.NET Framework 2.0-3.5上的项目,则选择ASP.NET 3.5)。
    3. 单击“确定”。

答案 3 :(得分:25)

您是在虚拟目录还是应用程序中运行Web API应用程序?

例如:当我将项目移动到默认网站&gt;下的本地IIS时,我遇到了同样的问题。 SampleWebAPI。我认为这是由于URL路由更改如下:

原文:localhost:3092/api/values
已移动:localhost/SampleWebAPI/api/values

如果您将Web API项目移动到在不同端口上运行的自己的网站,它似乎可以正常工作。

补充说明:我在网站中添加了api作为应用程序的别名,导致有效的URL成为:{/ p>

localhost:81/api/api/values - 在将网站移至其自己的网站后注意到这一点

因此,由于我希望在我的网站和web api mvc项目网站之间保持分离,因此我将global.asax中的路由规则从api/{controller}/{id}更改为{controller}/{id}的“默认APII” 1}}和从Default{controller}/{id}的ASP.NET MVC info/{controller}/{id}

答案 4 :(得分: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 标签当然已经存在,但我添加了 modules 标签,然后 remove &amp; 标记添加到模块标记。

答案 5 :(得分:11)

要检查的一些事项:

  1. 确保已安装.NET Framework 4.
  2. 确保为您的网站选择了.NET Framework的第4版。虚拟目录(如果适用)。
  3. 确保已安装MVC或在bin目录中包含相应的DLL。
  4. 可能需要允许ASP.NET 4.0 Web服务扩展
  5. 将应用程序放入其自己的应用程序池中。
  6. 确保目录至少包含&#34; Scripts Only&#34;执行权限。

答案 6 :(得分:9)

我有类似的问题。我在web.config文件中设置了正确的设置,但是在经典模式而不是集成模式

中运行应用程序池

screen shot

答案 7 :(得分:6)

由于以下

,也可能发生此问题

1.在Web.Config

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

2.确保在部署Web API的服务器上的bin文件夹中提供以下内容

  • System.Net.Http

  • System.Net.Http.Formatting

  • System.Web.Http.WebHost

  • System.Web.Http

如果发布是通过Visual Studio,则默认情况下不会将这些程序集复制到bin文件夹中,因为Web API程序包是通过开发计算机中的Nuget安装的。如果您希望将这些文件作为Visual Studio发布的一部分提供,那么您需要为这些程序集将CopyLocal设置为True

Sadish Kumar.V

答案 8 :(得分:5)

我也遇到了这个问题。我通过转到应用程序池&gt;解决了这个问题。应用程序池名称并将.NET Framework从版本v.2.0.50727更改为v4.0.30319。

答案 9 :(得分:4)

基于此SO answer,我只需将path="*."更改为path="*",以便ExtensionlessUrlHandler-Integrated-4.0 <{1}}中configuration>system.WebServer>handlers添加web.config / p>

在:

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

答案 10 :(得分:3)

微软正式修复: http://support.microsoft.com/kb/980368

我强烈建议不要使用&lt; modules runAllManagedModulesForAllRequests =“true”&gt;。 这导致所有已注册的HTTP模块将处理所有请求(甚至.jpg,.css,.pdf等)。 有两个负面时刻:a)硬件资源的额外负载; b)潜在的错误,因为http模块将处理新类型的内容。

答案 11 :(得分:2)

在按照Windows Azure教程告诉我将文件“WebRole.cs”添加到我的项目后,我开始从Web API获得404响应。

从我的项目中删除“WebRole.cs”后,我的Web API调用再次开始工作。

答案 12 :(得分:2)

我必须在发布期间禁用文件发布选项&#34;预编译。&#34;

答案 13 :(得分:2)

请确保应用程序池处于集成模式
并将以下内容添加到web.config文件中:

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

答案 14 :(得分:2)

就我而言,问题只是我试图访问该网站

myserver.myintranet.com/mysite

但IIS中http的网站绑定没有在绑定中指定的主机名。它以前工作过,我不知道它是如何被吹走的。

myserver.myintranet.com放入主机名后,404就消失了。

在IIS管理器中,您可以在操作窗格中进入绑定... ,然后编辑http绑定以指定主机名。

答案 15 :(得分:1)

有同样的问题,从IIS提供的web api控制器的404响应但是VS2010的一切正常。上述解决方案均不适合我。最终我发现问题是我们为应用程序添加了WSE 3.0支持,并且应用程序的/ bin目录中缺少Microsoft.Web.Services3 dll。很奇怪,但在复制dll后,路由映射开始起作用。

答案 16 :(得分:1)

不要忘记部署global.asax

答案 17 :(得分:1)

如果仅将 bin文件夹放置在IIS中(在生成项目之后),也会发生此问题。在这种情况下,您应该使用VisualStudio 发布项目,然后将发布的文件夹放入IIS。

答案 18 :(得分:1)

对我来说,问题是根站点被配置为使用.NET 2.0应用程序池,而我在该站点中的应用程序是.NET 4.5。

我创建了一个具有.NET 4应用程序池的新站点,并将我的应用程序放置在该站点的根目录下-并且运行良好。

答案 19 :(得分:0)

我也在努力解决这个问题。我的确切问题是我有一个ASMX Web服务,当我将参数输入到Web方法并对其进行测试时,它会给我404.特定方法在过去运行良好并且没有被更改,只有重新发表。然后我到了这里,尝试了所有发布的答案&amp;什么都没有帮助。

我的终极解决方案?我知道这很激烈,但我刚刚创建了一个新的Visual Studio解决方案和Web项目。选择MVC,然后我做了一个“添加”&gt; “New Item”,选择“Visual C#”&gt;在此之下的“Web”和“Web服务(ASMX)”。我复制了所有旧的代码隐藏代码,然后我记下了它在我的新项目中给出新文件的命名空间,然后将我所有的旧代码粘贴到新项目中的新代码隐藏文件中并放入命名空间回到原来的样子。然后我在我的项目中创建了我在使用Visual Studio进行“添加”&gt;之前的文件夹。 “新文件夹”,然后使用Windows资源管理器将我的文件复制回我的其他项目的文件夹中,然后在Visual Studio中右键单击每个文件夹并执行“添加”&gt; “现有项目......”并将这些文件夹中的项目拉入我的新项目的Visual Studio文件夹中。我再次引用了所有的.NET程序集,两个项目都打开了,所以我可以比较之前引用的那些(我有一个吨!)。我不得不将我的新项目命名略有不同 - 例如我基本上做了类似于“GeneralWebApp”而不是“MyWebApp”的东西 - 所以我必须在我的整个解决方案中做一个“全部替换”以替换该名称,所以它会为我的所有文件获取正确的命名空间。然后我在项目上做了一个“Rebuild All”,然后在我得到正确构建时Visual Studio提供的“Play”按钮启动它。它工作正常。所以我发布了它,当我从那里运行它时,我发布它的服务器上的一切都很好。我没有解释发生了什么,但这就是我通过它的方式。仅仅看看Visual Studio正在做的事情是否已经破坏它并不是一个糟糕的测试。

答案 20 :(得分:0)

我有一个类似的问题,因为我没有为Web API正确定义路由。这是我的解决方案:

public class Global : System.Web.HttpApplication { void Application_Start(object sender, EventArgs e) { GlobalConfiguration.Configuration.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = System.Web.Http.RouteParameter.Optional } );

    }

}

这些页面帮助了我

https://docs.microsoft.com/en-us/previous-versions/aspnet/hh834746(v=vs.118)?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/configuring-aspnet-web-api

答案 21 :(得分: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是自动添加它们的,不确定为什么

答案 22 :(得分:0)

尝试此webconfg ..用您的主dll替换“ NewsApi.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>

答案 23 :(得分:0)

以上都不对我有用。最后,它与任何配置都没有任何关系。

当我尝试使用内置的IISExpress 10.0通过Visual Studio 2017运行调试会话时遇到404错误。对我来说,当该版本发布到IIS服务器时,它可以正常工作,但是在通过VS进行本地调试时却得到404。

原来,问题出在项目bin目录中的一些旧编译文件似乎在干扰。最后做了一个“干净的解决方案”,关闭了VS,删除了bin和obj文件夹。重新启动VS并重建项目,错误消失了。

答案 24 :(得分:0)

这是一个非常明显的答案/菜鸟错误,但我想我会把它放在这里,以防它对某人有所帮助。所以我的结构是,一个在IIS中拥有一个网站,其前端是该网站下的一个应用程序,后端是另一个。后端应用程序下面有六个单独的api应用程序。我忘记了将每个api文件夹转换为IIS中的应用程序,这当然导致到我的api端点的路由返回404.0错误。

我的观点:首先检查简单的内容!确保您已将所有文件夹都转换为IIS中的应用程序,这是网站正常运行所必需的。

答案 25 :(得分:0)

与Web API和.Net Core Web API陷入同样的​​问题。在调试时在VS 2017中工作正常,但在发布到IIS 7.5时返回404。我的解决方案是改变我创建网站的方式。我不得不发布到网站的根目录(通过右键单击站点...添加网站创建),而是创建一个应用程序(通过右键单击网站...添加应用程序创建)并发布到该文件夹​​。请注意,对于Core版本,我必须将Application Pool .NET Framework Version设置更改为“No Managed Code”。

答案 26 :(得分:0)

我什么都不做,只需在web.config中添加此标记即可 这个问题出现以下几点之一

  1. 使用MVC或asp.net表单在同一项目中使用Web Api

  2. 在Global.asax中使用RouteConfig和WebApiConfig 如         GlobalConfiguration.Configure(WebApiConfig.Register);         RouteConfig.RegisterRoutes(RouteTable.Routes);

  3. 将RouteConfig用于2个目的,使用带有friendlyurl的asp.net表单和用于MVC路由的mvc路由

  4. 我们只是在web.config中使用此标记,它将起作用。

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

答案 27 :(得分:0)

我花了很多时间尝试了很多事情,最终意识到我在网站/默认网站中添加了我的网络应用程序,但在另一个链接到另一个端口的网站上。显然,在端口80上尝试localhost会产生404.

答案 28 :(得分:0)

我遇到了同样的问题:在新安装的Visual Studio 2013计算机上,web api项目在IISExpress下运行,但不在本地IIS下运行。我尝试了所有可以找到的东西,但最终问题不再是Web API,而是使用MVC:即使已经安装,也没有运行MVC项目。

对我有用的是卸载IIS(来自ADD / REMOVE Windows功能),然后重新安装它,然后运行aspnet_regiis -i。也许这有助于其他人。

答案 29 :(得分:0)

当我为UrlRoutingModule-4.0启用复选框时,我已经解决了这个问题:

IIS管理器&gt;模块&gt;选择UrlRoutingModule-4.0&gt;编辑模块&gt; 选中复选框“仅对ASP.NET应用程序或托管处理程序的请求调用”。

答案 30 :(得分:0)

我最近在我的所有Web Api 2路由/控制器上都发现了404错误。所以我进入实际服务器并尝试使用localhost而不是主机名进行浏览,并获得“404.7 Not Found - 请求过滤模块配置为拒绝文件扩展名”。

This SO post help me solve it.

答案 31 :(得分: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>      

答案 32 :(得分:0)

你在做什么样的HTTP请求?

这是一个稍微左侧的字段答案,但您是否尝试删除404的IIS默认错误页面以检查您的API实际返回的内容?

我有一个问题,我希望控制器方法在我向其发布错误的ID时返回404。我发现我总是得到IIS 404“文件或目录未找到”页面,而不是我的API的HTTP响应。删除默认的404错误页面解决了问题。

不同的问题,但你永远不知道它可能会有所帮助;)

答案 33 :(得分:-1)

确保未选中 解决方案->项目->右键单击属性->应用程序->自动生成绑定重定向