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

时间:2013-03-13 15:41:39

标签: asp.net iis-7 asp.net-web-api

我有一个ASP.NET Web API,在使用localhost:1783

的“IIS Express”上运行时可以正常工作

Settings in VS

但是,如果我没有“使用IIS Express”,然后按“创建虚拟目录”......

New settings

...我刚收到404错误: The 404 error

任何想法都错了吗?谢谢!

12 个答案:

答案 0 :(得分:39)

虽然标记的答案可以使其正常工作,但您真正需要添加到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中网站的根目录。通过将模块添加到此应用程序的配置中,我们让模块在此应用程序的路径(您的子目录路径)下运行,并且路由模块启动。

答案 1 :(得分:14)

对我来说,除了runAllManagedModulesForAllRequests="true"我还需要编辑"path" 属性如下。以前我的路径属性是"*.",这意味着它只在包含点的网址上执行 字符。但是,我的应用程序的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>

答案 2 :(得分:10)

您可能需要安装Hotfix KB980368

  

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

     

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

     

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

     

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

     

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

     

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

答案 3 :(得分: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

答案 4 :(得分:2)

有人说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

答案 5 :(得分:0)

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

Visual Studio 2012 Update 2

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

答案 6 :(得分:0)

我有同样的问题。更多的R&amp; D我发现了这个问题。

但只要你的配置是finne意味着aspnet 64位和IIS那么好 我看到的唯一问题是路径“web api采取本地方向路径”,所以你需要狂热它。像这样.. 〜../../../ api / products /

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

对我来说,这个问题与其他答案略有不同,因为我在OPTIONS上只收到404,但我已经在我的Integrated Extensionless URL Handler选项中明确说明了OPTIONS。非常混乱。

  1. 正如其他人所说,runAllManagedModulesForAllRequests =&#34; true&#34;在 模块节点是一种简单的方法来解决大多数Web API 404问题 - 尽管我更喜欢@DavidAndroidDev的答案,这种方式的内容要少得多。但在我的案例中还有一些额外的东西。
  2. 不幸的是,我在IIS中的“请求过滤”下设置了此集:
  3. 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>
    

    虽然它不是这个问题的完美答案,但它是&#34; IIS OPTIONS 404&#34;的第一个结果。在Google上,所以我希望这可以帮助别人;今天花了我一个小时。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

在完成以下所有设置之后,请花整整一周的时间!最后保存下来。 从IIS中的ISAPI文件管理器中删除UrlScan可以解决我们的问题

答案 11 :(得分:0)

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

这对我有用!

string baseUrl = NavigationManager.BaseUri.ToString();

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