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

Posted

技术标签:

【中文标题】在 IIS 7.5 中托管的 Web Api 中找不到 HTTP 404 页面【英文标题】:HTTP 404 Page Not Found in Web Api hosted in IIS 7.5 【发布时间】:2012-03-30 23:29:27 【问题描述】:

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

【问题讨论】:

我也有同样的问题。我还没有找到解决方案,但是我发现的一件事是,如果在 IIS 中选择站点,然后转到 Handler Mappings 功能,则静态文件的映射将 * 映射到必须存在的文件。当我删除此映射并为所有 HTTP 动词添加新映射时,我不再得到 404,它被一个空白页面替换。 >>使用 VS 2010 调试开发服务器。 ——又名邪恶的卡西尼。请参阅blogs.msdn.com/b/rickandy/archive/2011/04/22/… -- 如果这不起作用,创建一个新的 MVC 4 WebApi 应用程序并测试部署 - 简单 【参考方案1】:

我也在为此苦苦挣扎。幸运的是,Steve Michelotti 记录了一个对我有用的解决方案here。

最后,我在我的 Web 配置中为 ExtensionlessUrlHandler-Integrated-4.0 处理程序启用了所有动词 (verb="*")。

<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 为那个。但是我使用 IIS 管理器在应用程序的处理程序映射中更改了它。它是为一堆动词打开的。我将其更改为所有动词(*),瞧。但总是最好放入源代码。 我遇到了同样的问题,但这些更改对我没有帮助。还有其他配置吗?或者可能是图书馆参考?另请参阅:***.com/questions/27303523/… 很多人说使用 runAllManagedModulesForAllRequests 会影响性能(查看下面 hemant gautam 的答案)。但是我无法获得相同的服务,所以我按照这里的配置:blog.maartenballiauw.be/post/2012/12/07/… 该链接还指出启用 WebDAV 也会影响结果 很棒的答案! 对我来说,动词已经是*。我还必须将路径更改为 * 以使其正常工作,因为 *. 仍然导致问题【参考方案2】:

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

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

如http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html 中所述,应避免使用上述解决方案。改用这个。 Lopside 也提供了相同的解决方案。保留它是为了让用户避免实施第一个工作解决方案。

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

【讨论】:

工作正常,但这不是很好的解决方案。最好使用 UrlRoutingModule (请参阅下面 Lopside 的回答)。 britishdeveloper.co.uk/2010/06/…【参考方案3】:

如果 IIS 是在 ASP.NET 之后安装或启用的,您需要手动向 IIS 注册 ASP.NET 才能使您的 .NET 应用程序正常工作。

对于 Windows 7 及更早版本:

    以管理员身份运行命令提示符 (cmd.exe)。 导航到适当的 .NET Framework 位置。 (例如 C:\Windows\Microsoft.NET\Framework64\v4.0.30319) 运行 aspnet_regiis.exe -i

对于 Windows 8 及更高版本:

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

【讨论】:

我从 IIS Express 迁移到完整的 IIS,这就是为我解决的问题。谢谢! 类似于上面的@JimBrown;从 IIS express 迁移后它对我有用。 这为我解决了。在 Windows 7 上,Visual Studio 2015 Ent,新的 MVC 5 网站,从 IIS Express 更改为完整的 IIS。【参考方案4】:

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

例如:当我将项目移动到本地 IIS 下的默认网站 > SampleWebAPI 时,我遇到了同样的问题。我相信这是由于URL 路由的变化如下:

原文:localhost:3092/api/values 已转:localhost/SampleWebAPI/api/values

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

附加说明:我通过在我的网站中添加 api 作为应用程序的别名使问题更加复杂,这导致有效的 URL 为:

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

因此,因为我想保持我的网站和 web api mvc 项目站点之间的分离,我将 global.asax 中 Web API“DefaultAPI”的路由规则从 api/controller/id 更改为 controller/id 和 ASP .NET MVC 一个 Defaultcontroller/idinfo/controller/id

【讨论】:

呵呵呵呵...我在IIS 中也将我的应用程序命名为api。这导致所有这些试错调试超过 2 小时。非常感谢您分享您的经验!重命名它,现在我又重新开始工作了。 :D 谢谢 - 这是我的问题! :) 当我将项目托管在端口 8080 下时,我不确定为什么 api 调用失败,只是将其作为默认网站下的虚拟目录移动就可以了 :)【参考方案5】:

这是唯一对我有用的答案...

我遇到了类似的问题...似乎无论我做什么,都没有重定向,我的全局文件只是被忽略了。在找到这个答案之前,我认真考虑过结束这一切。我希望此链接对其他人有所帮助。

Stack Overflow - Diagnosing 404 errors on IIS 7 and ASP.NET MVC

将以下内容添加到 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 & add 标签到模块标签。

【讨论】:

在 2008(不是 R2)服务器上遇到这个问题,这是唯一对我有用的解决方案。此外,我必须将其与将应用程序池设置为“集成”模式相结合。【参考方案6】:

需要检查的几件事:

    确保您已安装 .NET Framework 4。 确保为您的网站和虚拟目录(如果适用)选择 .NET Framework 版本 4。 确保您已安装 MVC 或在您的 bin 目录中有适当的 DLL。 可能需要允许 ASP.NET 4.0 Web 服务扩展 将应用程序放入自己的应用程序池中。 确保该目录至少具有“仅脚本”执行权限。

【讨论】:

我在同一台 IIS 服务器上运行了 4 个其他普通 Web 应用程序,它们都使用 .net 框架 4。那么这 4 点中的哪一个不需要?当我发布我的 mvc 应用程序时,我添加了添加可部署依赖项并添加了 ASP.NET MVC,因此它位于我的 bin 目录中 @Armand 听起来你已经完成了#1。 #2仍然是必要的。添加可部署的依赖项,如果您按照此处所述进行操作:haacked.com/archive/2011/05/25/bin-deploying-asp-net-mvc-3.aspx,应该注意上面的#3。 #4 可能需要也可能不需要,尽管我不知道什么时候不需要它。【参考方案7】:

我遇到了类似的问题。我的 web.config 文件中的设置正确,但在 Classic 模式 而非 Integrated 模式

下运行应用程序池

【讨论】:

【参考方案8】:

由于以下原因也可能发生此问题

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

萨迪什·库马尔.V

【讨论】:

如果您没有在服务器上安装 MVC,则需要这些 DLL。在我的情况下,我在尝试调用 API 时看到了一个空白页面。手动添加 DLL 对我有用。谢谢!! 将 System.Net.Http 添加到主发布文件夹后,我的问题解决了,我的是 Asp.net Core 解决方案【参考方案9】:

基于此SO answer,我只需将path="*." 更改为path="*" 即可在我的configuration&gt;system.WebServer&gt;handlers 中添加ExtensionlessUrlHandler-Integrated-4.0 web.config

之前:

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

我也遇到了这个问题。我通过转到 Application Pools > Application Pool Name 解决了这个问题,并将 .NET Framework 从版本 v.2.0.50727 更改为 v4.0.30319。

【讨论】:

我自己也发现了这一点。赞成您的答案,因为它很容易错过。当我为我的应用程序创建站点时,IIS 自动为我创建了一个应用程序池,设置为 .NET v2.0 !!为什么,为什么,为什么?? :)【参考方案11】:

我不得不禁用文件发布选项“发布期间预编译”。

【讨论】:

你在哪里做的? 它位于当您右键单击项目并选择发布时出现的对话框中。看起来像this【参考方案12】:

微软官方修复: http://support.microsoft.com/kb/980368

我强烈不建议使用 。 这导致所有请求(甚至 .jpg、.css、.pdf 等)都将由所有已注册的 HTTP 模块处理。 有两个负面影响: a) 硬件资源的额外负载; b) 潜在错误,因为 http 模块将处理新类型的内容。

【讨论】:

非常感谢!我尝试了其他所有方法,这是唯一解决它的方法。 这里也一样,非常感谢您添加此答案!是我的问题的解决方案!【参考方案13】:

在遵循 Windows Azure 教程后,我开始收到来自 Web API 的 404 响应,该教程告诉我将文件“WebRole.cs”添加到我的项目中。

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

【讨论】:

这对我有用。我将 Azure 应用程序迁移回 VM 部署,在注释掉 WebRole.cs 的内容后,我的 WebAPI 调用再次开始工作。 我一定花了一天的时间!评论 WebRole.cs 有效 - 想知道为什么【参考方案14】:

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

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

【讨论】:

【参考方案15】:

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

myserver.myintranet.com/mysite

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

一旦我将myserver.myintranet.com 输入主机名,404 就消失了。

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

【讨论】:

即使我也面临同样的问题。正如你所建议的,我检查了 http 绑定中的主机名,它只正确更新。但我的问题仍然存在。注意:我将我的 API 应用程序作为子应用程序托管。请建议是否有人对此有想法。例如:“sample.example.com”是我的主要应用程序,并在此域下创建了一个 API,名为“sample.example.com/myAPI/”【参考方案16】:

别忘了部署 global.asax

【讨论】:

【参考方案17】:

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

【讨论】:

【参考方案18】:

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

我创建了一个带有 .NET 4 应用程序池的新站点,并将我的应用程序放在该站点的根目录下 - 效果很好。

【讨论】:

【参考方案19】:

我也为此苦苦挣扎。我的确切问题是我有一个 ASMX Web 服务,当我在 Web 方法中输入参数并对其进行测试时,它会给我 404。该特定方法过去运行良好并且没有更改,只能重新发布。然后我到了这里并尝试了所有发布的答案,但没有任何帮助。

我的终极解决方案?我知道这很激烈,但我刚刚创建了一个新的 Visual Studio 解决方案和 Web 项目。选择MVC,然后我做了一个“添加”>“新项目”,在它下面选择了“Visual C#”>“Web”和“Web Service (ASMX)”。我复制了所有旧代码隐藏代码,然后记下了它在新项目中为新文件提供的命名空间,然后将所有旧代码粘贴到新项目中的新代码隐藏文件中,并将命名空间回到原来的样子。

然后我在我的项目中创建了我在使用 Visual Studio 执行“添加”>“新建文件夹”之前的文件夹,然后使用 Windows 资源管理器将我的文件复制回我的其他项目的文件夹中,然后右键单击Visual Studio 中的每个文件夹并执行“添加”>“现有项目...”并将这些文件夹中的项目拉到我的新项目的 Visual Studio 文件夹中。我再次引用了我所有的 .NET 程序集,打开了两个项目,这样我就可以比较我之前引用的那些(有几个)。我不得不为我的新项目命名略有不同 - 例如,基本上我做了一些类似于“GeneralWebApp”而不是“MyWebApp”的东西 - 所以我必须在我的整个解决方案中做一个“全部替换”来替换那个名字,所以它会为我的所有文件获取正确的命名空间。

然后我对项目进行了“全部重建”,然后在我正确构建项目时使用 Visual Studio 提供的“播放”按钮启动它。它工作得很好。所以我发布了它,当我从那里运行它时,在我发布它的服务器上一切都很好。我无法解释发生了什么,但这就是我度过难关的方式。只是看看 Visual Studio 正在做的事情是否搞砸了,这并不是一个糟糕的测试。

【讨论】:

【参考方案20】:

如果你只将bin文件夹放在IIS中(在构建项目之后),也会出现这个问题。在这种情况下,您应该使用 VisualStudio发布项目,然后将发布的文件夹放入 IIS。

【讨论】:

【参考方案21】:

您发出什么样的 HTTP 请求?

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

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

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

【讨论】:

【参考方案22】:

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

This SO post help me solve it.

【讨论】:

【参考方案23】:

当我启用 UrlRoutingModule-4.0 的复选框时,它为我解决了:

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

【讨论】:

【参考方案24】:

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

对我有用的是卸载 IIS(从添加/删除 Windows 功能),然后重新安装它,然后运行 ​​aspnet_regiis -i。也许这对其他人有帮助。

【讨论】:

【参考方案25】:

我花了很多时间尝试了很多事情,最终意识到我不是在站点/默认网站中添加我的网络应用程序,而是在绑定到另一个端口的另一个网站中。显然在端口 80 上尝试 localhost 会得到 404。

【讨论】:

【参考方案26】:

我什么都不做,只是在 web.config 中添加这个标签,它的工作 这个问题提出以下几点之一

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

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

    将 RouteConfig 用于 2 个目的,asp.net 表单使用友好 URL 和 mvc 路由进行 MVC 路由

我们只是在 web.config 中使用这个标签,它会起作用。

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

【讨论】:

【参考方案27】:

在使用 Web API 和 .Net Core Web API 时遇到了同样的问题。调试时在 VS 2017 中运行良好,但在发布到 IIS 7.5 时返回 404。对我来说,解决方案是改变我创建网站的方式。我必须创建一个应用程序(通过右键单击网站...添加应用程序创建)并发布到该文件夹​​,而不是发布到网站的根目录(通过右键单击站点...添加网站创建)。请注意,对于 Core 版本,我必须将应用程序池 .NET Framework 版本设置更改为“无托管代码”。

【讨论】:

【参考方案28】:

对我来说,解决方案是从我的 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已经自动添加了它们,不知道为什么

【讨论】:

【参考方案29】:

试试这个 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>

【讨论】:

【参考方案30】:

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

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

【讨论】:

以上是关于在 IIS 7.5 中托管的 Web Api 中找不到 HTTP 404 页面的主要内容,如果未能解决你的问题,请参考以下文章

在 IIS 7.5 中托管的 .Net Remoting 服务中,如何删除“Server : IIS/7.5”标记表单响应头

IIS 7.5、Web 服务和 HTTP 405 错误

ASP.Net MVC 3/4 托管在 IIS 7.5 默认处理程序映射上

Restful WCF IIS 7.5 405 方法不允许间歇

IIS 之 在IIS7IIS7.5中应用程序池最优配置方案

IIS 之 在IIS7IIS7.5中应用程序池最优配置方案