【问题标题】:IIS Classic Mode .NET Web API Call returns 404 ErrorIIS 经典模式 .NET Web API 调用返回 404 错误
【发布时间】:2020-10-27 23:12:48
【问题描述】:

我有一个预先存在的 VB.NET Web 应用程序在 Windows Server 2012 R2 的 IIS 8 上运行。应用程序需要处理我使用 APIController 接口实现的新 API 调用(例如 localhost/test/ping)。我能够在本地 Visual Studio 上成功运行 API 调用,但是一旦将其部署到 IIS,url 就会返回 404 错误。

经过一些挖掘和研究,我认为部分问题是网络应用程序在处理程序映射中没有 ExtensionlessUrlHandler-Integerated-4.0。查看配置,显然部分先决条件是应用程序不能是经典模式下的我,我的是。我无法切换到集成模式,这会破坏我的应用程序。

有没有办法绕过这个限制。


更新:添加 web.config

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
  <handlers>
    <add name="MVC" path="*." verb="*" type="" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="File" requireAccess="None" allowPathInfo="false" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="4194304" />
  </handlers>
</system.webServer>

更新:添加源代码

TestController.vb

<RoutePrefix("message")>
Public Class PingController
    Inherits ApiController

  Public Sub New() {
     ...
  }

      <Route("")>
    <HttpGet>
    Public Function GetMessage As String
        Return "Hello World"
    End Function
 ...

全球.asax

<script runat="server">
    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)

        GlobalConfiguration.Configure(AddressOf WebApiConfig.Register)
    End Sub
...

WebApiConfig.vb

Public Class WebApiConfig
    Public Shared Sub Register(ByVal Configuration As HttpConfiguration)
        Configuration.MapHttpAttributeRoutes()
    End Sub
End Class

【问题讨论】:

  • 您在 IIS 上有虚拟目录吗?如果是这样,请确保您的 API 控制器的相对 URL 正确。在这种情况下,它可以在本地 IISExpress 中工作,但在 IIS 上失败。我过去有时会遇到类似的问题。无论如何,我认为这是某种路由问题,但是没有源代码很难说更多。
  • @AndrewSilver 我认为我没有使用虚拟目录。我也在原始描述中添加了源代码。
  • 我想我可能已经解决了部分问题。我在我的代码周围添加了一些日志语句,我注意到 global.asax startApplication 没有被调用。我看到 App_global.asax.compiled & App_global.dll,但在 bin 目录中。

标签: asp.net vb.net iis iis-8 windows-server-2012-r2


【解决方案1】:

如果您对服务器具有完全访问权限,则可以创建所谓的通配符脚本映射,以便可以在 IIS 7.0(经典模式)或 IIS 6.0 中使用默认的 ASP.NET MVC 路由表。此通配符脚本映射会将所有到 Web 服务器的请求映射到 ASP.NET 框架。

为 IIS 7.0(经典模式)启用通配符脚本映射:

1)打开 IIS,选择您的站点/应用程序

2)双击中间窗格中的处理程序映射

3)点击添加通配符脚本映射链接

4)输入aspnet_isapi.dll文件的路径(可以从PageHandlerFactory脚本映射中复制该路径)

输入名称MVC 点击确定按钮

为 web.config/system.webServer/handlers 部分添加 runAllManagedModulesForAllRequests="true"

更多详情请参考以下链接:

Using ASP.NET MVC with Different Versions of IIS (C#)

【讨论】:

  • 我按照您的指示进行操作,但仍遇到与以前相同的问题。我更新了上面的答案,包括我对 web.config 所做的更改。
  • 我做了更多的挖掘,我认为这个解决方案只适用于 MVC,不适用于 ApiController。
  • @Chen 尝试检查 url 是否正确,并确保您安装了正确的 asp.net 框架版本。
  • 所以我相信我的网址是正确的。它在 VS 上本地工作,除非 IIS 以某种方式改变它。至于正确的 ASP.NET 版本,我安装了 4.5 ASP.NET & Extension。
  • @Chen 你可以重新安装iis。
猜你喜欢
  • 2020-10-20
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
相关资源
最近更新 更多