Cookies 如何在服务器端Blazor中访问HttpContext?

Cookies 如何在服务器端Blazor中访问HttpContext?,cookies,httpcontext,blazor,Cookies,Httpcontext,Blazor,我需要访问页面(.cshtml)中的HttpContext,尤其是一个请求和一个cookie。尽管可用,HttpContextAccessor始终在其HttpContext属性中存储一个null值 任何想法都将不胜感激 提前谢谢 编辑:我使用的Blazor版本是:0.7.0。Blazor.Sever to Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddServerSi

我需要访问页面(.cshtml)中的
HttpContext
,尤其是一个请求和一个cookie。尽管可用,
HttpContextAccessor
始终在其
HttpContext
属性中存储一个null

任何想法都将不胜感激

提前谢谢


编辑:我使用的Blazor版本是:0.7.0。

Blazor.Sever to Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddServerSideBlazor<Client.Startup>();

    // HttpContextAccessor
    services.AddHttpContextAccessor();
    services.AddScoped<HttpContextAccessor>();
}
blazor.Client到App.cshtml

@inject blazor.Shared.HttpContextAccessor HttpContext
<Router AppAssembly=typeof(Program).Assembly />

@functions 
{      
    protected override void OnInit()
    {
       HttpContext.Context.Request.Cookies.**

       // Or data passed through middleware in blazor.Server
       HttpContext.Context.Features.Get<T>()
    }
}
@inject blazor.Shared.HttpContextAccessor HttpContext
@功能
{      
受保护的覆盖void OnInit()
{
HttpContext.Context.Request.Cookies**
//或通过blazor.Server中的中间件传递的数据
HttpContext.Context.Features.Get()
}
}

信用证:

将以下内容添加到Blazor.Web.App.Startup.cs:

services.AddHttpContextAccessor();
.cshtml

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor httpContextAccessor
注意:在编写此答案时,访问HttpContext的操作如上所述。从那时起,Blazor得到了快速发展,并发生了根本性的变化。上面所描述的用法肯定是不推荐的,但遗憾的是,如果您从.cshtml页面访问HttpContext,您仍然可以这样做,这是合法和正确的。这并没有改变。。。因此,在不向DI容器添加IHttpContextAccessor的情况下,您可以访问HttpContext的唯一位置是_Host.cshtml文件,它是一个Razor Pages文件,扩展名为.cshtml。当执行此文件中的代码时,Blazor仍然没有出生,并且此文件的执行将服务于Blazor服务器应用程序。请看看如何正确地做这件事


希望这有帮助…

这取决于您想要访问的内容

如果您想访问身份验证或用户信息,请考虑使用替代:

@page/“
@使用System.Security.Claims
@使用Microsoft.AspNetCore.Components.Authorization
@注入AuthenticationStateProvider AuthenticationStateProvider
索赔资料
获取ClaimsPrincipal数据
@_authMessage

@如果(_claims.Count()>0) {
    @foreach(var索赔在_索赔中) {
  • @claim.Type&ndash;@claim.Value
  • }
} @_姓氏信息

@代码{ 私有字符串authMessage; 私有字符串(u)消息; private IEnumerable_claims=Enumerable.Empty(); 专用异步任务GetClaimsPrincipalData() { var authState=等待AuthenticationStateProvider.GetAuthenticationStateAync(); var user=authState.user; if(user.Identity.IsAuthenticated) { _authMessage=$“{user.Identity.Name}已通过身份验证。”; _索赔=用户索赔; _姓氏消息= $“姓氏:{user.FindFirst(c=>c.Type==ClaimTypes.姓氏)?.Value}”; } 其他的 { _authMessage=“用户未通过身份验证。”; } } }
请注意,文档中明确说明不应将IHttpContextAccessor用于Blazor应用程序:


(这并不意味着在您的特定情况下,它将不适用于特定的场景。但由于您无论如何只能从第一个请求中获取cookie-一旦SignalR接管不再是cookie-您可能应该在_Host.cshtml为rendernd时获取该值,并将其作为字符串值从按照此处的Microsoft说明进行操作后,

为了将我的项目升级到asp.net core 5.0,我导致了这个问题

第6步是用
addscoped
替换
addtransient
。没有
addtransient
,刚开始blazor之旅,我猜了一下,在我的代码中添加了
addscoped
行。这阻止了令牌与用户一起传递

我认为正确的方法是仅在替换addTransient行时添加这一行

builder.Services.AddScoped(sp => new HttpClient{ BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); 

这无法工作:services.AddScoped();IHttpContextAccessor是Singleton…而shared是两个应用程序之间共享的库?不清楚,必须猜测。同志们,此解决方案是错误的,不起作用。顺便说一句,HttpContextAccessor类是在Microsoft.AspNetCore.Http命名空间中定义的,不应重新定义。此类实现IHttpContextAccessor接口。以及AddHttpContextAccessor为您创建了一个singleton对象。所以请使用它。同志说:…共享是两个应用程序之间共享的库?为什么不清楚?这是Blazor结构的基础。Asp.net核心开发人员和朋友应该明白,为了成为Blazor开发人员,他们应该投入一些时间学习Blazor.t他们不能在没有先前知识的情况下开始开发。学习曲线比Angular的要小,但仍然很陡峭。请注意Microsoft不推荐使用
IHttpContextAccessor
:这是“服务器端”吗Blazor应用程序?它是一款相同的应用程序…没关系。它可以同时适用于两款应用程序…只要尝试一下,并告诉我们它是否适用于您…似乎这是更好的方法。不需要额外的LIB。(是的,不清楚-但是猜测是正确的。)请注意,Microsoft不建议使用
IHttpContextAccessor
:您不应该在服务器端blazor上使用IHttpContextAccessor。您应该从cshtml向应用程序传递值。请检查此代码示例,感谢Shimmy,这是一个更可行的选项。这很好。但为什么我不能通过此选项进行调试?调试器在GetAuthen退出ticationstatesync()。我觉得这很恼人-不知道什么时候会发生这种情况,因为“无法调试”或“错误代码从未有过机会”。
builder.Services.AddScoped(sp => new HttpClient{ BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });