IIS 经典模式 .NET Web API 调用返回 404 错误

Che*_*hen 5 vb.net asp.net iis iis-8 windows-server-2012-r2

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

经过一些挖掘和研究,我认为部分问题是 Web 应用程序在处理程序映射中没有 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>
Run Code Online (Sandbox Code Playgroud)

更新:添加了源代码

测试控制器.vb

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

  Public Sub New() {
     ...
  }

      <Route("")>
    <HttpGet>
    Public Function GetMessage As String
        Return "Hello World"
    End Function
 ...
Run Code Online (Sandbox Code Playgroud)

全球.asax

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

        GlobalConfiguration.Configure(AddressOf WebApiConfig.Register)
    End Sub
...
Run Code Online (Sandbox Code Playgroud)

WebApiConfig.vb

Public Class WebApiConfig
    Public Shared Sub Register(ByVal Configuration As HttpConfiguration)
        Configuration.MapHttpAttributeRoutes()
    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

Jal*_*hal 0

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

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

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

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

在此输入图像描述

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

在此输入图像描述

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

输入名称MVC 单击确定按钮

在此输入图像描述

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

请参阅以下链接了解更多详细信息:

将 ASP.NET MVC 与不同版本的 IIS 结合使用 (C#)