如何通过 HttpContext 访问 Blazor Server .Net 6 中的 cookie?

use*_*779 3 .net blazor

不幸的是,有关在 Blazor Server 中访问 c​​ookie 的教程和之前的 StackOverflow 答案似乎在新的 .Net 版本中变得无效。例如,我无法获得以下任一答案(并根据 .net 6 中没有的注释来判断): How to use the HttpContext object in server-side Blazor to检索有关用户、用户代理的信息
如何在服务器端 Blazor 中访问 HttpContext?

我有一个包含以下代码的 Program.cs 文件:

..
builder.Services.AddHttpContextAccessor();
..  
Run Code Online (Sandbox Code Playgroud)

它还有一个 app.MapPost 方法,使用以下方法设置 cookie: HttpContext.Response.Cookies.Append

我可以确认 cookie 有效,因为在邮递员中,我可以在查询此 app.MapPost 方法时成功检索它。

当尝试在 Login.Razor 页面中查询该方法时,它可以工作,但未设置 cookie。在此 Login.razor 中,httpContextAccessor.HttpContext.Request.Cookies["my_cookie"] 始终返回 null (即使响应本身是 200 OK,并且我可以很好地读取其内容,但没有可通过 HttpContext 检索的 cookie)。

这似乎是一个常见问题,从两个链接的答案来看,该问题已解决,但现在在 .net 6 中似乎再次出现问题。如何访问 Blazor Server .net 6 中的 HttpContext 以访问查询中发送的 cookie?

Ara*_*ani 5

请不要AddHttpContextAccessor()在 Blazor 服务器中使用。

我在.Net6中使用以下方法:

我首先按如下方式修改_Host.cshtml文件。

@{
var myCookie = HttpContext.Request.Cookies["CookieName"];
}
<component type="typeof(App)" render-mode="ServerPrerendered" param-AccessToken="myCookie" />
Run Code Online (Sandbox Code Playgroud)

我将 Cookie 信息放入 myCookie 变量中,并将其分配给组件的param-AccessToken.

然后我转到该App.razor文件并将AccessToken变量定义为级联值。如下:

<CascadingValue Name="AccessToken" Value="AccessToken">
<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Program).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
        </Found>
        <NotFound>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</CascadingAuthenticationState>
Run Code Online (Sandbox Code Playgroud)
 @code{
    [Parameter]
     public string AccessToken { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

最后,任何需要 Cookie 信息值的组件只需将其定义为级联参数即可。例如,我创建一个名为的组件ShowToken.razor,并将其代码如下:

@page "/showtoken"

<p>This is a part of Cookie info @(AccessToken != null ? AccessToken.Substring(0,30) : "(null)")</p>


@code {
    [CascadingParameter(Name = "AccessToken")] public string AccessToken { get; set; }
}
Run Code Online (Sandbox Code Playgroud)