我有一个 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>
我也在为此苦苦挣扎。幸运的是,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 会导致问题。幸运的是,我也没有遇到这个问题。
有同样的问题。此配置设置解决了该问题。
<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>
如果 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)。单击确定。
您是在虚拟目录还是应用程序中运行 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
这是唯一对我有用的答案...
我有一个类似的问题......似乎无论我做什么,都没有重定向,我的全局文件只是被忽略了。在找到这个答案之前,我认真考虑过结束这一切。我希望这个链接可以帮助其他人。
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 标签当然已经存在,但我将模块标签添加到它,然后将删除和添加标签添加到模块标签。
需要检查的几件事:
确保您已安装 .NET Framework 4。确保为您的网站和虚拟目录(如果适用)选择了 .NET Framework 版本 4。确保您已安装 MVC 或在您的 bin 目录中有适当的 DLL。可能需要允许 ASP.NET 4.0 Web 服务扩展 将应用程序放入它自己的应用程序池中。确保该目录至少具有“仅脚本”执行权限。
我有一个类似的问题。我在 web.config 文件中有正确的设置,但是在经典模式而不是集成模式下运行应用程序池
https://i.imgur.com/rSOwuYW.png
由于以下原因,也可能发生此问题
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
萨迪什·库马尔
基于此 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" />
我也遇到了这个问题。我通过转到应用程序池 > 应用程序池名称解决了这个问题,并将 .NET Framework 从版本 v.2.0.50727 更改为 v4.0.30319。
有来自微软的官方修复:http://support.microsoft.com/kb/980368
我强烈不建议使用
在遵循 Windows Azure 教程后,我开始从 Web API 收到 404 响应,该教程告诉我将文件“WebRole.cs”添加到我的项目中。
从我的项目中删除“WebRole.cs”后,我的 Web API 调用再次开始工作。
请确保应用程序池处于集成模式并将以下内容添加到 web.config 文件中:
<system.webServer>
.....
<modules runAllManagedModulesForAllRequests="true" />
.....
</system.webServer>
就我而言,问题只是我试图访问该网站
myserver.myintranet.com/mysite
但是 IIS 中 http 的网站绑定没有在绑定中指定主机名。它以前有效,我不知道它是如何被吹走的。
一旦我将 myserver.myintranet.com
放入主机名,404 就消失了。
在 IIS 管理器中,您进入操作窗格中的绑定...,然后编辑 http 绑定以指定主机名。
不要忘记部署 global.asax
有同样的问题,从 IIS 提供的 web api 控制器的 404 响应,但从 VS2010 一切正常。以上解决方案都不适合我。最终我发现问题在于我们为应用程序添加了 WSE 3.0 支持,而应用程序的 /bin 目录中缺少 Microsoft.Web.Services3 dll。很奇怪,但是在复制了dll之后,路由映射就开始起作用了。
我什么都不做,只是在 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>
对我来说,问题是根站点被配置为使用 .NET 2.0 应用程序池,而我在该站点中的应用程序是 .NET 4.5。
我创建了一个带有 .NET 4 应用程序池的新站点,并将我的应用程序放在它的根目录下——效果很好。
我也为此苦苦挣扎。我的确切问题是我有一个 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 正在做的事情是否把它搞砸了,这并不是一个糟糕的测试。
如果在 IIS 中只放置 bin 文件夹(在构建项目之后),也会出现此问题。在这种情况下,您应该使用 VisualStudio 发布项目,然后将发布的文件夹放入 IIS。
你发出什么样的 HTTP 请求?
这是一个稍微偏左的答案,但您是否尝试过删除 404 的 IIS 默认错误页面以检查您的 API 实际返回的内容?
我有一个问题,我希望控制器方法在我向其发布错误的 id 时返回 404。我发现我总是得到 IIS 404“找不到文件或目录”页面,而不是来自我的 API 的 HTTP 响应。删除默认的 404 错误页面解决了该问题。
不同的问题,但您永远不知道它可能会有所帮助;)
最近我的所有 Web Api 2 路由/控制器都出现 404 not found 错误。因此,我进入实际服务器并尝试使用 localhost 而不是主机名进行浏览,并得到“404.7 Not Found - 请求过滤模块配置为拒绝文件扩展名”。
This SO post help me solve it.
当我为 UrlRoutingModule-4.0 启用复选框时,它为我解决了:
IIS 管理器 > 模块 > 选择 UrlRoutingModule-4.0 > 编辑模块 > 选中复选框“仅调用对 ASP.NET 应用程序或托管处理程序的请求”。
我遇到了同样的问题:在新安装的装有 Visual Studio 2013 的机器上,web api 项目在 IISExpress 下运行,但不在本地 IIS 下运行。我尝试了我能找到的一切,但最终问题不是 Web API 所必需的,而是 MVC:即使它已安装,也没有 MVC 项目正在运行。
对我有用的是卸载 IIS(从添加/删除 Windows 功能),然后重新安装它,然后运行 aspnet_regiis -i。也许这对其他人有帮助。
我花了很多时间尝试了很多事情,最终意识到我不是在站点/默认网站中添加我的 web 应用程序,而是在绑定到另一个端口的另一个网站中。显然在端口 80 上尝试 localhost 会得到 404。
遇到与 Web API 和 .Net Core Web API 相同的问题。调试时在 VS 2017 中运行良好,但在发布到 IIS 7.5 时返回 404。对我来说,解决方案是改变我创建网站的方式。而不是发布到网站的根目录(通过右键单击站点...添加网站创建),我必须创建一个应用程序(通过右键单击网站...添加应用程序创建)并发布到该文件夹。请注意,对于 Core 版本,我必须将应用程序池 .NET Framework 版本设置更改为“无托管代码”。
对我来说,解决方案是从我的 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已经自动添加了它们,不知道为什么
试试这个 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>
这是一个非常明显的答案/新手错误,但我想我会把它放在这里以防它可能对某人有所帮助。所以我的结构是在 IIS 中有一个网站,前端作为网站下方的一个应用程序,后端是另一个。后端应用程序有六个单独的 api 应用程序位于其下方。我忘记将每个 api 文件夹转换为 IIS 中的应用程序,这当然会导致到我的 api 端点的路由返回 404.0 错误。
我的观点:首先检查简单的东西!确保您已将所有文件夹转换为 IIS 中的应用程序,这是您的网站正常运行所必需的。
*
。我还必须更改*
的路径才能使其正常工作,因为*.
仍然导致问题