ASP.NET Web API 应用程序在 IIS 7 上部署时提供 404

Posted

技术标签:

【中文标题】ASP.NET Web API 应用程序在 IIS 7 上部署时提供 404【英文标题】:ASP.NET Web API application gives 404 when deployed at IIS 7 【发布时间】:2013-03-01 15:44:28 【问题描述】:

我有一个 ASP.NET Web API,在使用 localhost:1783 在“IIS Express”上运行时可以正常工作

但是当我打开“使用 IIS Express”然后按“创建虚拟目录”时...

...我只收到 404 错误:

任何想法有什么问题吗?谢谢!

【问题讨论】:

你在哪里设置文件路径。 您是否已签入系统托盘以查看在 IIS express 上运行的应用程序 @Shekhar 据我了解,单击创建虚拟目录时,VS 会为我执行此操作。即物理路径似乎正确,Virtual Pah 是 MySite1。 “文件路径”是别的吗? 【参考方案1】:

虽然标记的答案可以正常工作,但您真正需要添加到 webconfig 的只是:

    <handlers>
      <!-- Your other remove tags-->
      <remove name="UrlRoutingModule-4.0"/>
      <!-- Your other add tags-->
      <add name="UrlRoutingModule-4.0" path="*" verb="*" type="System.Web.Routing.UrlRoutingModule" preCondition=""/>
    </handlers>

请注意,这些都没有特定的顺序,尽管您希望在添加之前先删除。

我们最终得到 404 的原因是因为 URL 路由模块只在 IIS 中为网站的根目录启动。通过将模块添加到此应用程序的配置中,我们使模块在此应用程序的路径(您的子目录路径)下运行,并且路由模块启动。

【讨论】:

这个解决方案更好,因为对 runAllManagedModulesForAllRequests="true" britishdeveloper.co.uk/2010/06/… 有负面影响 我发现这会破坏所有静态文件。它不应该在模块部分吗? ***.com/a/16475231/1280068 使用您上面建议的设置,我收到以下错误:system.web.urlroutingmodule does not implement iHttpHandlerFactory...。而是as suggested here,我在下添加了配置,去掉了path和verb属性,同样报错。 像@stuartdotnet 我也遇到了这个解决方案中静态文件的损坏 要使静态文件/包正常工作,您还需要将其添加到上述module:&lt;remove name="BundleModule" /&gt; &lt;add name="BundleModule" type="System.Web.Optimization.BundleModule" /&gt;【参考方案2】:

对我来说,除了拥有runAllManagedModulesForAllRequests="true",我还必须编辑"path" 下面的属性。以前我的路径属性是 "*." 这意味着它只在包含点的 url 上执行 特点。但是,我的应用程序的 url 不包含点。当我将路径切换到"*" 时,它就起作用了。 这是我现在拥有的:

  <system.webServer>
      <validation validateIntegratedModeConfiguration="false" />
      <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule"/>
      </modules>

      <handlers>
          <remove name="WebDAV" />
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
      </handlers>
  </system.webServer>

【讨论】:

【参考方案3】:

您可能需要安装 Hotfix KB980368。

本文介绍了一种更新,它使某些 Internet 信息服务 (IIS) 7.0 或 IIS 7.5 处理程序能够处理其 URL 不以句点结尾的请求。具体来说,这些处理程序被映射到“”。请求路径。当前,映射到“”的处理程序。请求路径仅处理 URL 以句点结尾的请求。例如,处理程序仅处理 URL 类似于以下 URL 的请求:

http://www.example.com/ExampleSite/ExampleFile.

应用此更新后,映射到“*.”的处理程序request path 可以处理 URL 以句点结尾的请求和 URL 不以句点结尾的请求。例如,处理程序现在可以处理类似于以下 URL 的请求:

http://www.example.com/ExampleSite/ExampleFile

http://www.example.com/ExampleSite/ExampleFile.

应用此补丁后,ASP.NET 4 应用程序可以处理对无扩展名 URL 的请求。因此,在处理程序执行之前运行的托管 HttpModules 将运行。在某些情况下,HttpModules 可能会返回无扩展 URL 的错误。例如,编写为仅预期 .aspx 请求的 HttpModule 现在在尝试访问 HttpContext.Session 属性时可能会返回错误。

【讨论】:

如果您有一个带有 IIS 7.0(不是 R2)的 Windows 2008 服务器,那么这是修补程序的下载链接:microsoft.com/en-us/download/details.aspx?id=11342【参考方案4】:

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

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

【讨论】:

你刚刚救了我几个小时的痛苦。 +1! 这个答案的第 2 部分解决了这个问题***.com/questions/30315563/… 第 1 部分不好:(正如britishdeveloper.co.uk/2010/06/… 解释的那样,您应该只添加 url 路由模块 :)【参考方案5】:

有人说 runAllManagedModulesForAllRequests="true" 会有性能问题和 MVC 路由问题。 他们建议使用以下内容:

http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html

http://bartwullems.blogspot.com/2012/06/optimize-performance-of-your-web.html

【讨论】:

请嵌入/写下您的答案,而不仅仅是链接 当我在 webforms + web api asp.net 应用程序中使用 runAllManagedModulesForAllRequests="true" 时,我遇到了巨大的性能损失【参考方案6】:

对我来说,这个问题与其他答案略有不同,因为我在 OPTIONS 上只收到 404,但我已经在我的集成无扩展 URL 处理程序选项中明确说明了 OPTIONS。非常混乱。

    正如其他人所说,runAllManagedModulesForAllRequests="true" 在 模块节点是一揽子修复大多数 Web API 404 问题的简单方法 - 尽管我更喜欢 @DavidandroidDev 的答案,它的侵入性要小得多。但在我的情况下还有一些额外的东西。 不幸的是,我在 IIS 中的站点请求过滤下设置了这个:

通过将以下 安全节点 添加到 web.config 是必要的 - 包含完整的 system.webserver 以用于上下文:

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <remove name="WebDAV" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <security>
      <requestFiltering>
        <verbs>
          <remove verb="OPTIONS" />
        </verbs>
      </requestFiltering>
    </security>
  </system.webServer>

虽然这不是这个问题的完美答案,但它是谷歌上“IIS OPTIONS 404”的第一个结果,所以我希望这对某人有所帮助;今天花了我一个小时。

【讨论】:

【参考方案7】:

如果您使用的是 Visual Studio 2012,请下载并安装 Microsoft 最近发布的 Update 2(截至 2013 年 4 月)。

Visual Studio 2012 Update 2

该更新中有一些与该问题相关的错误修复。

【讨论】:

【参考方案8】:

我也有同样的问题。经过大量的研发,我发现了问题。

但只要你的配置是 finne 意味着 aspnet 64 位和 IIS 就好了 我看到的唯一问题是路径“web api 采用本地目录路径”,因此您需要使用它。像这样.. ~../../../api/products/

非常感谢您发布问题。我在配置文件中学习了很多 abt iis 和其他设置。

【讨论】:

【参考方案9】:

几天来,我一直在与这个问题作斗争,尝试了各种建议。我的开发机器工作正常,但我正在部署的新机器给了我 404 错误。

在 IIS 管理器中,我比较了两台机器上的处理程序映射,发现很多处理程序丢失了。结果发现机器上没有安装 ASP.Net 5。

【讨论】:

【参考方案10】:

对我来说,在运行使用 IIS Express 的应用程序时,我的网站未使用 IIS Express(使用本地 IIS)收到 404 错误。如果我关闭用于运行 IIS Express 的浏览器,那么 404 就会消失。对我来说,我的 IIS Express 项目调用了本地 IIS 服务,因此我将 IIS Express 项目转换为使用本地 IIS,然后一切正常。由于某种原因,您似乎无法同时运行非 IIS Express 和本地 IIS 网站。

【讨论】:

【参考方案11】:

在以下所有设置成功之后,花一整周的时间!终于得救了。 从 IIS 中的 ISAPI 过滤器中删除 UrlScan 解决了我们案例中的问题

【讨论】:

【参考方案12】:

我在使用 Blazor 时遇到了这个问题,发现将 NavManagers“baseUrl”合并到我对控制器的调用中解决了这个问题,无论使用虚拟目录还是根网站。

这对我有用!

string baseUrl = NavigationManager.BaseUri.ToString();

NavigationManager.NavigateTo(**baseUrl** + $"api/Download/DownloadFile?FileName=" + sFilename, true);

【讨论】:

以上是关于ASP.NET Web API 应用程序在 IIS 7 上部署时提供 404的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net web api iis使用

无法让 ASP.NET Core Web API 与 IIS 一起使用 [关闭]

IIS 中同一网站下的主机前端(react)和后端(ASP.NET Web Api)

ASP.NET Web API - 不允许 PUT 和 DELETE 动词 - IIS 8

仅在 IIS 部署后的 Asp.net Web api 异常:名为“HelpPage_Default”的路由已在路由集合中

将 ASP.NET Web API 部署到 IIS 服务器