只映射现有的Blazor页面(Razor组件)?



Blazor(服务器)应用程序的通常模式是在program.cs的末尾有app.MapFallbackToPage("/_Host");

这将导致所有的请求路径,匹配没有早期的端点,执行Blazor应用程序。当然,Blazor应用程序有一个<NotFound>Renderfragment,但这仍然会导致建立SignalR等。如果我想显示一个静态文件(.html)从wwwroot或一个特定的RAZOR页面(.cshtml),它不建立一个websocket的所有情况下,路由不存在于任何BLAZOR页面??

NavigationManager.NavigateTo不能直接在<NotFound>的BuildRenderTree标记内使用…我可以在里面放一个组件重定向OnInitialized。但这仍然需要SignalR.

我怎么能完全避免Blazor/SignalR的url不存在于Blazor应用程序?

想法:我可以尝试添加所有可能的Blazor-routes作为回退和最一般的回退到一些静态文件或Razor页面…但这似乎是大量的双重工作,非常容易出错…没有办法吗?

app.MapFallbackToPage("~/Admin/{*clientroutes:nonfile}", "/_Host");
app.MapFallbackToPage("~/SomeRoute/More/{*clientroutes:nonfile}", "/_Host");
app.MapFallbackToPage("~/SomePage/{*clientroutes:nonfile}", "/_Host");
app.MapFallbackToPage("/NotValidRoute");

编辑:

#的理由:

我想有一个单一的回退页(剃刀页或静态)的所有路由/url,不匹配任何目标在应用程序中。但遗憾的是,它似乎与blazor的客户端路由冲突。由于服务器端路由不知道哪些路由应该由blazor处理,因此它也不知道哪些路由不会映射到任何东西(razor页面和blazor的组合)。其他的请在这里纠正我。

有服务器端路由和客户端路由。在服务器端,中间件管道首先运行,处理静态文件和服务器定义的路由,包括回退路由。回退路由是不匹配静态文件请求的路由,具有最低优先级,因此它们不会优先于其他匹配路由。

服务器端路由不知道哪些路由将在客户端匹配。该数据模型是独立的。发生的事情是,当没有服务器路由匹配时,呈现主机页面,它引导客户端。现在您已经转换到客户端路由,并且不能重新输入(除非更改以刷新浏览器)

如果我想显示一个静态文件(.html)从wwwroot或一个特定的RAZOR页面(.cshtml),它不建立一个websocket的所有情况下,路由不存在于任何BLAZOR页面?

这需要知道客户端上存在哪些路由。

想法:我可以尝试添加所有可能的Blazor-routes作为回退和最一般的回退到一些静态文件或Razor页面…但这似乎是大量的双重工作,非常容易出错…没有办法吗?

可以使用组件来运行一些JavaScript,并将浏览器重定向到服务器上的固定路由。

编辑:

另一种方法是找到所有可路由的razor组件,并将它们全部作为回退路由映射到"_Host"

像这样(未测试):

// This should match wherever components are declared.
var types = typeof(Program).Assembly.GetTypes();
foreach (var type in types)
{
if (typeof(ComponentBase).IsAssignableFrom(type) && type.GetCustomAttribute<RouteAttribute>() is { } routeAttribute)
{
var route = routeAttribute.Template;
endpointRouteBuilder.MapFallbackToPage(route, "/_Host");
}
}

这部分取决于你的应用是如何托管的。在IIS中,您可以向任何网站添加应用程序,这些网站基本上是任何类型的网站,您可以使用"/path"补充说。

目前,我公司的主要应用是"ABCsite.com,"我的Blazor应用程序是"ABCsite.com/Blazor">

最新更新