在ASP.NET Core5.0中访问HttpContext的方法步骤
ASP.NETCore应用通过IHttpContextAccessor接口及其默认实现HttpContextAccessor访问HttpContext。只有在需要访问服务内的HttpContext时,才有必要使用IHttpContextAccessor。
通过RazorPages使用HttpContext
RazorPagesPageModel公开HttpContext属性:
publicclassAboutModel:PageModel { publicstringMessage{get;set;} publicvoidOnGet() { Message=HttpContext.Request.PathBase; } }
通过Razor视图使用HttpContext
Razor视图通过视图上的RazorPage.Context属性直接公开HttpContext。下面的示例使用Windows身份验证检索Intranet应用中的当前用户名:
@{ varusername=Context.User.Identity.Name; ... }
通过控制器使用HttpContext
控制器公开ControllerBase.HttpContext属性:
publicclassHomeController:Controller { publicIActionResultAbout() { varpathBase=HttpContext.Request.PathBase; ... returnView(); } }
通过中间件使用HttpContext
使用自定义中间件组件时,HttpContext传递到Invoke或InvokeAsync方法,在中间件配置后可供访问:
publicclassMyCustomMiddleware { publicTaskInvokeAsync(HttpContextcontext) { ... } }
通过自定义组件使用HttpContext
对于需要访问HttpContext的其他框架和自定义组件,建议使用内置的依赖项注入容器来注册依赖项。依赖项注入容器向任意类提供IHttpContextAccessor,以供类在自己的构造函数中将它声明为依赖项:
publicvoidConfigureServices(IServiceCollectionservices) { services.AddControllersWithViews(); services.AddHttpContextAccessor(); services.AddTransient(); }
如下示例中:
- UserRepository声明自己对IHttpContextAccessor的依赖。
- 当依赖项注入容器解析依赖链并创建UserRepository实例时,就会注入依赖项。
publicclassUserRepository:IUserRepository { privatereadonlyIHttpContextAccessor_httpContextAccessor; publicUserRepository(IHttpContextAccessorhttpContextAccessor) { _httpContextAccessor=httpContextAccessor; } publicvoidLogCurrentUser() { varusername=_httpContextAccessor.HttpContext.User.Identity.Name; service.LogAccessRequest(username); } }
从后台线程访问HttpContext
HttpContext不是线程安全型。在处理请求之外读取或写入HttpContext的属性可能会导致NullReferenceException。
要使用HttpContext数据安全地执行后台工作,请执行以下操作:
- 在请求处理过程中复制所需的数据。
- 将复制的数据传递给后台任务。
要避免不安全代码,请勿将HttpContext传递给执行后台工作的方法。而是传递所需要的数据。在以下示例中,调用SendEmailCore,开始发送电子邮件。将correlationId传递到SendEmailCore,而不是HttpContext。代码执行不会等待SendEmailCore完成:
publicclassEmailController:Controller { publicIActionResultSendEmail(stringemail) { varcorrelationId=HttpContext.Request.Headers["x-correlation-id"].ToString(); _=SendEmailCore(correlationId); returnView(); } privateasyncTaskSendEmailCore(stringcorrelationId) { ... } }
到此这篇关于在ASP.NETCore5.0中访问HttpContext的方法步骤的文章就介绍到这了,更多相关ASP.NETCore访问HttpContext内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!