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
});
});
我们的 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
});
});