我有一个服务器端 blazor 客户端,我正在尝试通过登录检查来修改 MainLayout razor 页面。我目前正在使用 Blazored 进行本地存储保存,并且我目前正在使用查看是否保存了令牌以查看用户是否登录,但是我不确定如何在 razor 页面的 if 语句中翻译它,因为它想要异步方法。
我的登录检查非常简单,如下所示。
public async Task<bool> IsLoggedIn()
{
return await m_localStorage.ContainKeyAsync("token").ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
在我的 Razor 页面中,我正在执行此语句检查 - 这显然不起作用,因为没有 async 修饰符
@if (!await AppState.IsLoggedIn()) //Requires async modifier
{
<a href="Login" target="_blank">Login</a>
}
Run Code Online (Sandbox Code Playgroud)
我也尝试使用 .Result 属性执行此操作,但这会导致抛出异常:(System.AggregateException: 'Information: Executed an implicit handler method, returned result Microsoft.AspNetC)' 带有内部异常 -> NullReferenceException : 你调用的对象是空的。
但是从我所看到的 AppState 被正确注入,本地存储似乎在 AppState 中被正确注入。
@if (!AppState.IsLoggedIn().Result)
{
<a href="Login" target="_blank">Login</a>
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是解决这个问题的正确方法是什么,有没有办法在剃刀页面中执行异步方法?
在创建 ASP.NET WebAPI 项目时,我正在使用 VS 2019 为天气预报数据提供的基本模板,并添加了一些非常基本的用户登录身份验证和对 JWT 令牌的支持,一切正常。
我正在尝试创建一个 blazor 客户端项目来使用 API 并在页面上显示数据。AFAIK Blazor 不支持 localstorage 所以我使用 Blazored LocalStorage 包给我这个能力。我的问题源于事实上在服务器端 blazor ( https://github.com/aspnet/AspNetCore/issues/13396 ) 中通过 OnInitializedAsync() 使用 JS 是不可能的,因此我不确定一个人应该如何消费这些 web api 调用。因为这会产生空引用异常
protected override async Task OnInitializedAsync()
{
var client = HttpFactory.CreateClient();
var token = await LocalStorage.GetItemAsync<string>("authToken");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var response = await client.GetAsync("url/WeatherForecast");
var str = await response.Content.ReadAsStringAsync();
Items = JsonConvert.DeserializeObject<IEnumerable<WeatherForecast>>(str);
}
Run Code Online (Sandbox Code Playgroud)
一个建议是使用 OnAfterRenderAsync() 方法来调用它们,因为届时 JS 将准备就绪。哪个半有效,但显然 UI 不匹配,因为它需要刷新 - 但是手动刷新似乎我必须调用 StateHasChanged(); 这又再次调用 OnAfterRender 方法,因此我不得不进行检查,但这最终感觉非常糟糕。 …
目前我正在使用 Executor 服务创建固定线程池,例如
executor = Executors.newFixedThreadPool(coreAmount);
Run Code Online (Sandbox Code Playgroud)
虽然这很好,但我想知道是否有可能保持创建多个线程的行为并更改最大池限制,以便在所有线程都在使用时创建一个新线程并使用它而不是等待其中一个要终止以启动的线程。
因此,例如,如果创建并正在使用 8 个线程,则第 9 个任务进入我希望它在当前使用的 8 个线程之外创建一个新线程。
它似乎newCachedThreadPool()具有这种行为,但我也希望能够创建类似于newFixedThreadPool(int nThreads)