当在IIS 7上部署ASP.NET Web API应用程序时,会出现404错误。

56

我有一个ASP.NET Web API,当在localhost:1783上通过"IIS Express"运行时可以正常工作。

VS中的设置

但是当我取消勾选"Use IIS Express"并按下"创建虚拟目录"之后...

新设置

...我只会得到404错误: 404错误

有什么想法是错的吗?谢谢!


在你设置文件路径的地方。 - शेखर
你是否在系统托盘中检查了正在运行的IIS Express应用程序? - Travis G
@Shekhar,据我理解,当单击“创建虚拟目录”时,VS会为我执行此操作。即物理路径似乎是正确的,虚拟路径是MySite1。那么“文件路径”是其他什么东西? - Cotten
12个回答

42
你只需要在web.config文件中添加以下内容:
    <modules>
      <!-- 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=""/>
    </modules>

请注意,这些步骤没有特定的顺序,但是您希望在添加之前先删除。
我们之所以会出现404错误,是因为Url路由模块只对IIS中网站的根目录起作用。通过将该模块添加到此应用程序的配置中,我们使该模块在此应用程序的路径(即子目录路径)下运行,并且路由模块开始起作用。

4
这个解决方案更好,因为将runAllManagedModulesForAllRequests="true"设置为真会产生负面影响。 - Oliver
我发现这会破坏所有静态文件。它不应该在模块部分吗?https://dev59.com/AnRB5IYBdhLWcg3wJUiu#16475231 - Stuart Dobson
3
使用您提供的设置,我遇到了以下错误: system.web.urlroutingmodule未实现iHttpHandlerFactory...。相反,按照这里的建议,我在<configuration><system.webserver><modules>下添加了配置,并删除了路径和动词属性,但仍然出错。 - Rafael Emshoff
像 @stuartdotnet 一样,我也在使用这个解决方案时遇到了静态文件的损坏问题。 - nelsonomuto
为了使静态文件/捆绑包正常工作,您还需要在“模块”中添加以下内容: - Alex
我已经有5年没有接触过.NET了,但听起来这比我的原始答案更好,我会将其标记为已接受。 - Cotten

15

对我来说,除了拥有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>

11
您可能需要安装Hotfix KB980368
本文介绍了一项更新,使得某些 Internet Information Services (IIS) 7.0 或 IIS 7.5 处理程序能够处理 URL 不以句号结尾的请求。具体来说,这些处理程序被映射到“*.”请求路径。目前,映射到“.”请求路径的处理程序仅处理 URL 结尾为句号的请求。例如,该处理程序仅处理 URL 类似于以下 URL 的请求: http://www.example.com/ExampleSite/ExampleFile。 应用此更新后,映射到“*.”请求路径的处理程序可以处理 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服务器,那么以下是热补丁的下载链接:http://www.microsoft.com/zh-cn/download/details.aspx?id=11342 - Jonas Kello

8
这个问题也可能是由以下原因引起的:
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。


这个回答的第二部分解决了这个问题http://stackoverflow.com/questions/30315563/webapiconfig-register-clears-routes-defined-by-routeconfig-registerroutes-apon-d 但第一部分不好:(正如http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html所解释的,您应该只需添加url路由模块:) - Spaceman

3

5
好的,我会尽力为你进行翻译。以下是需要翻译的内容:
  1. What is the capital of China?
  2. Can you recommend a good restaurant in this area?
  3. How do I get to the nearest train station from here?
  4. What time does the museum close today?
  5. Could you please give me directions to the nearest restroom?
  6. How much does it cost to take a taxi to the airport?
  7. What is the exchange rate for US dollars to euros?
  8. Do you accept credit cards?
  9. Is there a pharmacy nearby where I can buy some aspirin?
  10. Can you help me find a hotel in this city?
- yǝsʞǝla
当我在一个WebForms + Web API ASP.NET应用程序中使用runAllManagedModulesForAllRequests =“true”时,性能受到了巨大的影响。 - boggy

1
我已经为这个问题奋斗了几天,尝试了所有建议的方法。我的开发机器一切正常,但是我要部署到的新机器给我返回404错误。
在IIS管理器中,我比较了两台机器上的处理程序映射,发现缺少了很多处理程序。原来该机器上没有安装ASP.Net 5。

这让我少了一半的头疼。 - MFry

1
我在使用Blazor和.Net Core时遇到了这个问题,发现将NavManagers的“baseUrl”合并到我的对控制器的调用中,无论是使用虚拟目录还是根网站,都可以解决该问题。
这对我很有帮助!
string baseUrl = NavigationManager.BaseUri.ToString();

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

1

对我而言,这个问题与其他答案略有不同,因为我只在OPTIONS上收到404错误,尽管我已经在我的集成Extensionless URL Handler选项中明确指定了OPTIONS。非常令人困惑。

  1. 正如其他人所说,在模块节点中运行runAllManagedModulesForAllRequests="true"是解决大多数Web API 404问题的简单方法-尽管我更喜欢@DavidAndroidDev的答案,因为它更少侵入性。但在我的情况下还有一些额外的东西。
  2. 不幸的是,我在站点的请求过滤中设置了这个:

OPTIONS Issue with Request Filtering

为了解决这个问题,需要在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” 的第一个结果,所以我希望这能帮助到某些人;今天我花了一个小时。


0

我曾经遇到同样的问题。经过大量的研究和开发,我找到了问题所在。

但只要您的配置正确,也就是aspnet 64位和IIS都正常,那么我看到的唯一问题就是“web api采用本地目录路径”,因此您需要避免它。像这样:~../../../api/products/

非常感谢您发布这个问题。我学到了很多关于iis和配置文件中的其他设置。


0
对我来说,当我在使用 Local IIS 运行一个应用程序时,在没有使用 IIS Express 的网站上会收到 404 错误。如果我关闭运行 IIS Express 的浏览器,那么 404 错误就会消失。对我来说,我的 IIS Express 项目调用了本地 IIS 服务,所以我将 IIS Express 项目转换为使用本地 IIS,然后一切都正常了。似乎由于某种原因,你不能同时运行非 IIS Express 和本地 IIS 网站。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接