Cookies 如何在服务器端Blazor中访问HttpContext?
我需要访问页面(.cshtml)中的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
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) });