ASP.NET Core with SPA,如何处理root上的无效路由?

ASP.NET Core with SPA, how to handle invalid routes on root?

我们的 ASP.NET 核心以单页应用程序作为客户端,托管在 Azure Web 服务上。我们注意到所有环境和部署槽偶尔都会在 /index.html 上收到 POST 操作请求。在ASP.NET核心应用中,通过配置SPA静态文件提供者中间件将对root的http请求路由到SPA应用文件:

services.AddSpaStaticFiles(configuration => {
                configuration.RootPath = "ClientApp/dist/ClientApp";
});

当在 /index.html 上请求这些 POST 操作时,应用程序将抛出异​​常:

The SPA default page middleware could not return the default page '/index.html' because it was not found, and no other middleware handled the request.

反过来,异常会导致我们的性能监控出现问题,因为异常不在任何地方 caught/handled。特别是如果这种情况在短时间内多次发生。

问题:我们可以配置什么来立即 return 403 或类似的响应,或者设置我们至少捕获异常?

The SPA default page middleware could not return the default page '/index.html' because it was not found, and no other middleware handled the request.

  • 构建或发布项目时未复制wwwroot文件夹会出现此问题

  • 无论哪种情况,这两个命令都不会复制 wwwroot 文件夹。

  • 作为解决方法,您可以将此目标添加到您的项目文件中:

  <Target Name="AddGeneratedContentItems" BeforeTargets="AssignTargetPaths" DependsOnTargets="PrepareForPublish">
    <ItemGroup>
      <Content Include="wwwroot/**" CopyToPublishDirectory="PreserveNewest" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder);@(Content)" />
    </ItemGroup>
  </Target>

What can we configure to either immediately return 403 or similar response, or setup such that we at least catch the exception?

  • 另一个原因可能是,如果您的控制器路由属性与请求不完全匹配URL,则会发生此类错误。
  • 请参考 GitHub 中发现的类似问题。

我在 GitHub 的 issue case 中找到了解决方案。此解决方案仅在请求满足正确条件时调用中间件:当它是 GET 请求时。

在 Startup 的 Configure 方法中 class:

app.UseWhen(context => HttpMethods.IsGet(context.Request.Method), builder =>
{
    builder.UseSpa(spa =>
    {
       // ... add any option you intend to use for the Spa middleware
    });
});