0

我目前正在编写一个单页应用程序,并希望将所有传入请求(/api/{controller} 除外)映射到我的 Web 应用程序到根目录中的静态文件 (index.html)。前端的 WebApi 调用需要能够访问到 /api 的路由。关于如何实现这一目标的任何建议?

4

1 回答 1

1

您可以使用 IIS 7 url rewrite module。这个模块是 IIS Express 网络服务器的一部分,所以你不需要任何特别的东西来启用它。在您的生产 IIS 7 服务器上,您可能需要安装并启用the extension.

只需将以下规则添加到您的<system.webServer>部分:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <rewrite>
      <rules>
        <rule name="Rewrite to index.html">
          <match url="^(?:(?!api\/))" />
          <action type="Rewrite" url="index.html" />
        </rule>
      </rules>
    </rewrite>
    <handlers>
      <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="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 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="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 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="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

此外,由于您没有使用 ASP.NET MVC,因此您可以删除该~/App_Start/RouteConfig.cs文件,因为您没有任何 MVC 控制器。只需保留映射到 Web API 控制器~/App_Start/WebApiConfig.cs的端点路由的位置:~/api

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
于 2013-06-16T09:54:26.010 回答