ChatGPT解决这个技术问题 Extra ChatGPT

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

R
Roberto Leite de Moraes

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

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

<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/…
B
Brandon Gano

如果 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(如果您需要支持 .NET Framework 2.0-3.5 上的项目,则选择 ASP.NET 3.5)。单击确定。


我从 IIS Express 迁移到完整的 IIS,这就是为我修复它的原因。谢谢!
类似于上面的@JimBrown;从 IIS express 迁移后,它对我有用。
这为我解决了。在 Windows 7 上,Visual Studio 2015 Ent,新的 MVC 5 网站,从 IIS Express 更改为完整的 IIS。
L
Leniel Maccaferri

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

例如:当我将项目移动到默认网站下的本地 IIS 时,我遇到了同样的问题 >示例 WebAPI。我认为这是由于 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一个 Default{controller}/{id}info/{controller}/{id}


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

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

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

Stack Overflow - 诊断 IIS 7 和 ASP.NET MVC 上的 404 错误

将以下内容添加到 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 标签当然已经存在,但我将模块标签添加到它,然后将删除和添加标签添加到模块标签。


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

需要检查的几件事:

确保您已安装 .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 可能需要也可能不需要,尽管我不知道什么时候可以告诉你 &不需要。
B
Ben Anderson

我有一个类似的问题。我在 web.config 文件中有正确的设置,但是在经典模式而不是集成模式下运行应用程序池

https://i.imgur.com/rSOwuYW.png


S
Sadish Kumar V

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

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

萨迪什·库马尔


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

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

前:

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

非常感谢格雷格,因为这条愚蠢的路径 =“*”,我正要杀了我。但是现在,在丢掉这个可怜的点之后,一切都很好!非常感谢!
c
coson

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


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

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


你在哪里做呢?
它位于当您右键单击项目并选择“发布”时出现的对话框中。看起来像 this
R
Roman O

有来自微软的官方修复:http://support.microsoft.com/kb/980368

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


太感谢了!我绝对尝试了其他所有方法,这是唯一修复它的方法。
同样在这里,非常感谢您添加此答案!是我的问题的解决方案!
J
Josh Mouch

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

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


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

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

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

t
toddmo

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

myserver.myintranet.com/mysite

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

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

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


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

不要忘记部署 global.asax


d
devilcius

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


a
adnan

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

在使用 MVC 或 asp.net 表单的同一项目中使用 Web Api 在 Global.asax 中使用 RouteConfig 和 WebApiConfig 作为 GlobalConfiguration.Configure(WebApiConfig.Register); RouteConfig.RegisterRoutes(RouteTable.Routes);将 RouteConfig 用于 2 个目的,asp.net 表单使用 friendlyurl 和 mvc 路由进行 MVC 路由

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

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

J
JuniorEbuka

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

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


J
JohnH

我也为此苦苦挣扎。我的确切问题是我有一个 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 正在做的事情是否把它搞砸了,这并不是一个糟糕的测试。


E
Emad Armoun

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


O
Oliver Picton

你发出什么样的 HTTP 请求?

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

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

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


C
Community

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

This SO post help me solve it.


b
bluish

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

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


M
Marian Siminescu

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

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


g
guiomie

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


m
miked

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


p
protango

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


K
K-Dawg

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


A
Albert Marsnik

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

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