. net 5 Blazor服务器:每台主机的设置



我有一个Blazor服务器应用程序,可通过多个域名。基于主机,我想设置一些状态。因此,我创建了一个作用域服务:

services.AddScoped<MyState>();

我还创建了中间件来设置基于主机的MyState对象中的变量,类似于:

public async Task InvokeAsync(HttpContext context, MyState myState)
{
switch(context.Request.Host.Host) {
"example.com":
myState.variable = 1;
break;
...

app.UseEndpoints之前注册中间件

app.UseMiddleware<MyStateMiddleware>();

这一切都很好。我可以看到一切都是基于域名设置的。但突然间,看起来MyState服务正在重建。

我试着调试这个没有运气。

这会发生吗,因为我使用我自己的AuthenticationStateProvider?在应用程序获得授权后,事情似乎出了问题。授权是否更改范围,以便重新创建所有限定范围的服务?

真正的问题是:如何基于主机/域名创建状态?

编辑:顺便说一下,我还为中间件中的每个主机设置了CultureInfo。授权后不会重置。

您不需要中间件。您可以在App中获取信息并设置状态。示例代码如下:

<Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">
<Found Context="routeData">
<CascadingValue Value="this">
<RouteView RouteData="@routeData" DefaultLayout="typeof(MainLayout)" />
</CascadingValue>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
@code {
[Inject] private NavigationManager NavManager { get; set; }
protected override Task OnInitializedAsync()
{
var url = NavManager.BaseUri;
//  Set your state
return base.OnInitializedAsync();
}
}

然后你可以放入一些断点,看看如果状态被重置,你的身份验证代码是什么。

在回答切换行为基于域在_Host.cshtml我有这个在我的文件:

@page "/"
@namespace MyApp.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
Layout = null;
// get brand
var brand = MyApp.Branding.Brand.GetFromRequest(new ControllerRequest(Request));
}

这里的Request是Razor页面的HttpRequest对象,它具有可以使用的属性,如.Host.Cookies

最新更新