C# 在IIS 7.5中托管的Web Api中找不到HTTP 404页面
我有一个Web Api应用程序。当我使用VS2010调试开发服务器测试它时,它工作得非常好。但我现在将其部署到IIS7.5,并且在尝试访问该应用程序时遇到HTTP 404错误 这是我的web.configC# 在IIS 7.5中托管的Web Api中找不到HTTP 404页面,c#,asp.net-web-api,iis-7.5,http-status-code-404,C#,Asp.net Web Api,Iis 7.5,Http Status Code 404,我有一个Web Api应用程序。当我使用VS2010调试开发服务器测试它时,它工作得非常好。但我现在将其部署到IIS7.5,并且在尝试访问该应用程序时遇到HTTP 404错误 这是我的web.config 需要检查的几件事: 确保已安装.NET Framework 4 确保为您的网站和虚拟目录选择了.NET Framework的版本4(如果适用) 确保已安装MVC,或在bin目录中安装了相应的DLL 可能需要允许ASP.NET 4.0 web服务扩展 将应用程序放在它自己的应用程序池中 确保目
需要检查的几件事:
您正在发出什么类型的HTTP请求 这是一个稍微偏左的字段回答,但您是否尝试删除404的IIS默认错误页以检查API实际返回的内容 我有一个问题,当我向控制器方法发送错误的id时,我希望它返回404。我发现我总是从我的API获得IIS404“未找到文件或目录”页面,而不是HTTP响应。删除默认的404错误页面解决了问题
不同的问题,但你永远不知道它可能会有帮助;) 您是在虚拟目录还是应用程序中运行Web API应用程序 例如:当我将项目移动到默认网站>SampleWebAPI下的本地IIS时,我遇到了相同的问题。我认为这是由于
URL
路由发生如下变化:
原始:localhost:3092/api/values
移动:
localhost/SampleWebAPI/api/values
如果您将WebAPI项目移动到运行在不同端口上的自己的网站,它似乎可以工作
附加说明:我添加了api
作为我网站中应用程序的别名,这使得问题进一步复杂化,导致有效的URL
为:
localhost:81/api/api/values
-将网站移动到自己的网站后注意到了这一点
因此,因为我想保持我的网站和web api mvc项目网站之间的分离,我将web api“DefaultAPI”的
global.asax
中的路由规则从api/{controller}/{id}
更改为{controller}/{id}
并将ASP.NET mvc one中的Default
更改为{controller}/{id}
toinfo/{controller}/{id}
我也在努力解决这个问题。幸运的是,Steve Michelotti记录了一个对我有效的解决方案
在一天结束时,我在我的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会导致问题。幸运的是,我也没有遇到这个问题。我开始从Web API获得404响应,之前,我学习了一个Microsoft Azure教程,该教程告诉我将文件“WebRole.cs”添加到我的项目中
从我的项目中删除“WebRole.cs”后,我的Web API调用再次开始工作。如果在ASP.NET之后安装或启用了IIS,则需要手动向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)
单击“确定”
我也有同样的问题。此配置设置解决了该问题
<system.webServer>
.....
<modules runAllManagedModulesForAllRequests="true" />
.....
</system.webServer>
.....
.....
如上所述,应避免使用上述解决方案。用这个代替。
同样的解决方案也由“不平衡”提供。将其保留在此处,使用户可以避免实现第一个工作解决方案
<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提供服务时,web api控制器的响应为404,但从VS2010开始,一切正常。上述解决方案对我都不起作用。最后,我发现问题在于我们为应用程序添加了WSE 3.0支持,并且应用程序的/bin目录中缺少Microsoft.Web.Services3 dll。奇怪,但复制dll后,路由映射开始工作。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>
这是唯一对我有效的答案
我也有类似的问题。。。似乎无论我做了什么,都没有任何东西被重定向,我的全局文件被忽略了。在我找到答案之前,我认真考虑过结束这一切。我希望这个链接能帮助其他人
将以下内容添加到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标记当然已经存在了,但我将模块标记添加到其中,然后将移除和添加标记添加到模块标记。最近,我的所有Web Api 2路由/控制器都出现了404 not found错误。因此,我进入实际的服务器,尝试使用localhost而不是hos进行浏览
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<system.webServer>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
.........................
</modules>
</system.webServer>
<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" />
<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>