Blazor 服务器端 - 有没有办法在初始化期间获取 Cookie 值?

Blazor server side - Is there any way to get a Cookie value during the initialization?

想在 Startup.cs 中的应用程序初始化期间获取 cookie 值,但经过广泛搜索后我找不到任何解决方案。 我可以从 Razor 页面获取 cookie 并了解一些存储 NuGet 包。

进一步说明:
我想要一个类似的 cookie,语言和文化模块有什么:RequestCultureProvider 可以在配置期间读取该 cookie,但它有特殊的方法,功能等。 微软官方说明:
https://docs.microsoft.com/en-us/aspnet/core/blazor/globalization-localization?view=aspnetcore-5.0

在前面的示例中,如果用户想要更改语言,调用控制器以使用关联的语言信息重新加载新页面并将该值保存在 cookie 中。
如果我在 Startup 期间无法从 cookie 中获取最后使用的语言值,当我更改为一种新语言....

所以我想要类似的东西,例如:每个页面上都有一个货币选择器,并且想将它们的值存储在 cookie 中,这样下次用户访问该页面时,它会显示正确的货币 - 没有需要重新加载页面。

欢迎任何解决方案。

你可以简单地定义一个服务,当你需要保存一个给定的货币时,你调用它的set方法将这个值保存在本地存储中。你不需要cookie。当然,如果需要,您可以为此使用 cookie,但使用本地存储更简单。

现在,无论何时您想要检索此值,您都可以调用服务的 get 方法。您可以将此服务注入应用程序的每个组件。实际上,您不应该将它注入到单个组件中,您可以调用 CurrencySelector,并将其嵌入到 MainLayout 组件中,只是代替我之前答案代码中的 CultureSelector。不重新加载,不刷新,只重新渲染 CurrencySelector 组件

您的服务可能如下所示:

public class CurrencyProvider
{
    private readonly IJSRuntime _jsRuntime;

    public CurrencyProvider (IJSRuntime jsRuntime)
    {
        _jsRuntime = jsRuntime;
    }

    public async Task<string> GetCurrencyAsync()
        => await _jsRuntime.InvokeAsync<string>("localStorage.getItem", "currencyType");

    public async Task SetCurrencyAsync(string currency)
    {
        if (currency == null)
        {
            await _jsRuntime.InvokeAsync<object>("localStorage.removeItem", "currencyType");
        }
        else
        {
            await _jsRuntime.InvokeAsync<object>("localStorage.setItem", "currencyType", currency);
        }

      
    }
}

更新:

Thank you for your answer and time. This can be a solution, however my original question was about "Would like to get a cookie value during app initialization in Startup.cs". Is it possible?

是的,这是可能的。您应该创建一个中间件,并访问 HttpContext 以读取 cookie。

注意:以下代码描述了如何在您的应用程序初始化时访问 cookie。这是最简单正确的解决方案:

将以下代码片段放在 _Host.cshtml 文件的顶部:

@{
    var myCookie = HttpContext.Request.Cookies.FirstOrDefault(c => c.Key == ".AspNetCore.Cookies");

}

用cookie做任何你想做的事。如果要将值传递给 Blazor SPA,请在 App 组件中定义一个参数 属性,然后通过组件 html 标记帮助程序将 _Host.cshtml 文件中的值传递给它。

注意:上面CurrencyProvider的实现是比较合适的 为 Blazor 应用程序存储客户端数据的方式,因为 cookie 随每个请求一起发送,而本地存储保存可供 Blazor 应用程序免费使用的数据。