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


96

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

2
我有同样的问题。我尚未找到解决方案,但是我发现的一件事是,如果在IIS中选择站点,然后转到Handler Mappings功能,则存在静态文件的映射,该映射将*映射到必须存在的文件。当我删除此映射并为所有HTTP动词添加新映射时,我不再得到404,而是由空白白页代替。
Despertar 2012年

>>使用VS 2010调试开发服务器。-又名邪恶的卡西尼号。请参阅blogs.msdn.com/b/rickandy/archive/2011/04/22/…-如果无法正常工作,请创建一个新的MVC 4 WebApi应用并测试部署-简单
RickAndMSFT 2012年

Answers:


93

我也在为此而苦苦挣扎。幸运的是,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会导致问题。幸运的是,我也没有遇到这个问题。


3
+1。但是我使用IIS管理器在应用程序的处理程序映射中更改了它。启用了一系列动词。我将其更改为所有动词(*)和voila。但是总要放进源码。
Wolf5 2012年

1
我遇到了同样的问题,但是这些更改没有帮助我。还有其他配置吗?还是图书馆参考书?请,还请参阅:stackoverflow.com/questions/27303523/...
巴巴克

2
许多人说,使用runAllManagedModulesForAllRequests会影响性能(请在下面查看有关hemaut gautam的答案)。但是,我无法获得相同的服务,因此请按照以下配置进行操作: blog.maartenballiauw.be/post/2012/12/07/...该链接还指出,启用WebDAV会影响结果,以及
晃龙

很棒的答案!
EnocNRoll-AnandaGopal Pardue,

1
对我来说,动词已经是*。我不得不改变路径,*以使其像*.仍然引起问题
-Alsty

56

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

<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/...
Der_Meister

37

如果在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

对于Windows 8和更高版本:

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

2
我从用于开发的IIS Express迁移到了完整的IIS,这就是我所需要解决的问题。谢谢!
吉姆·布朗

1
类似于上面的@JimBrown; 从IIS Express迁移后,它对我有用。
Solid不论2015年

这为我解决了。在Windows 7上,新的MVC 5网站Visual Studio 2015 Ent从IIS Express更改为完整IIS。
Geoff Gunter

26

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

例如:当我将项目移到默认网站> SampleWebAPI下的本地IIS时,我遇到了同样的问题。我相信这是由于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 one 的路由规则Default{controller}/{id}更改为info/{controller}/{id}


3
呵呵呵......我是这么叫我的应用程序中IIS作为api了。这导致了超过2小时的所有尝试和错误调试。非常感谢您分享您的经验!重命名它,现在我又恢复了业务。:D
蕾妮尔·麦克卡弗里(Leniel Maccaferri)

谢谢-这是我的问题!:)

我不确定为什么将项目托管在端口8080下时api调用失败,只是将其作为默认目录下的虚拟目录移动就可以了:)
Kiran 2015年

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标记添加到了其中,然后进行了删除添加标记到modules标记。


在2008年(不是R2)服务器上遇到此问题,这是唯一对我有用的解决方案。另外,我还必须将应用程序池设置为“集成”模式,才能将其结合起来。
Zoomzoom

11

要检查的几件事:

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

我在同一IIS服务器上运行了其他4个普通的Web应用程序,并且它们都使用.net Framework4。因此,这4个点中的哪一个是不需要的?当我发布我的mvc应用程序时,我添加了可部署的依赖项并添加了ASP.NET MVC,所以它位于我的bin目录中
Armand 2012年

@Armand听起来您已经完成了#1。#2仍然是必需的。添加可部署的依赖项(如果您按照此处所述进行操作):haacked.com/archive/2011/05/25/bin-deploying-asp-net-mvc-3.aspx,应注意上述#3。#4也许是必要的,也可能不是必需的,尽管我不知道何时不需要它。
Joe Schrag 2012年

9

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

屏幕截图


7

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

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手动为我工作。谢谢!!
Vipul bhojwani 2016年

将System.Net.Http添加到主发布文件夹后,我的问题得到解决,我的问题是Asp.net Core解决方案
Mohas

6

在此基础上SO答案,我不得不改变path="*.",以path="*"所添加ExtensionlessUrlHandler-Integrated-4.0configuration>system.WebServer>handlersweb.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" />

非常感谢Greg,由于这个愚蠢的路径=“ *”,我正要杀了我。但是现在,在丢下这个悲惨的点之后,一切都很好!非常感谢你!
Junior Silva '18

5

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


1
我也是自己发现这个的。建议您回答,因为它很容易遗漏。当我为我的应用创建站点时,IIS会自动为我创建一个应用池,设置为.NET v2.0!为什么,为什么,为什么?:)
Mike Taverne

3

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


那你在哪里呢?
vapcguy

1
右键单击项目并选择发布时,该对话框将出现。它看起来像这样
Pakman

3

微软提供了官方修复程序: http //support.microsoft.com/kb/980368

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


1
谢谢你这么多!我绝对尝试了其他所有方法,而这是修复它的唯一方法。
奥兰·丹尼森

同样在这里,非常感谢您添加此答案!是我的问题的解决方案!
Octavio Garbarino

2

在遵循Windows Azure教程之后,我开始从Web API获取404响应,该教程告诉我向项目添加文件“ WebRole.cs”。

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


这对我有用。我将Azure应用程序迁移回了VM部署,并且在注释掉WebRole.cs的内容之后,我的WebAPI调用再次开始工作。
Scott

我一定为此花了一天!在谈到WebRole.cs工作-难怪但是
Igorek

2

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

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

2

就我而言,问题仅在于我试图访问该站点

myserver.myintranet.com/mysite

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

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

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


即使我也面临着同样的问题。并按照您的建议,我在http绑定中检查了主机名,并且仅正确更新了它。但是我的问题仍然存在。注意:我将API应用程序托管为子应用程序。请提出任何想法。例如:“ sample.example.com”是我的主要应用程序,并在此域下创建了一个名为“ sample.example.com/myAPI/”的API
克里希纳·玛尼


1

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


1

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

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


1

我也为此感到挣扎。我的确切问题是,我有一个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是否正在做某件事,这并不是一个坏测试。


1

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


0

您正在发出哪种HTTP请求?

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

我遇到一个问题,当我向它发布错误的ID时,我希望控制器方法返回404。我发现我一直在获取IIS 404“找不到文件或目录”页面,而不是从我的API获得HTTP响应。删除默认的404错误页面可以解决此问题。

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


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>      

0

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

这样的帖子可以帮助我解决。


0

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

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


0

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

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


0

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


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个目的,将asp.net形式与friendlyurl和mvc路由一起用于MVC路由

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

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

0

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


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是自动添加它们的,不确定为什么


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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.