在ASP.NET Core5.0中访问HttpContext的方法步骤

ASP.NET Core 应用通过 IHttpContextAccessor 接口及其默认实现 HttpContextAccessor 访问 HttpContext。 只有在需要访问服务内的 HttpContext 时,才有必要使用 IHttpContextAccessor。

通过 Razor Pages 使用 HttpContext

Razor Pages PageModel 公开 HttpContext 属性:

public class AboutModel : PageModel
{
  public string Message { get; set; }

  public void OnGet()
  {
    Message = HttpContext.Request.PathBase;
  }
}

通过 Razor 视图使用 HttpContext

Razor 视图通过视图上的 RazorPage.Context 属性直接公开 HttpContext。 下面的示例使用 Windows 身份验证检索 Intranet 应用中的当前用户名:

@{
  var username = Context.User.Identity.Name;

  ...
}

通过控制器使用 HttpContext

控制器公开 ControllerBase.HttpContext 属性:

public class HomeController : Controller
{
  public IActionResult About()
  {
    var pathBase = HttpContext.Request.PathBase;

    ...

    return View();
  }
}

通过中间件使用 HttpContext

使用自定义中间件组件时,HttpContext 传递到 Invoke 或 InvokeAsync 方法,在中间件配置后可供访问:

public class MyCustomMiddleware
{
  public Task InvokeAsync(HttpContext context)
  {
    ...
  }
}

通过自定义组件使用 HttpContext

对于需要访问 HttpContext 的其他框架和自定义组件,建议使用内置的依赖项注入容器来注册依赖项。 依赖项注入容器向任意类提供 IHttpContextAccessor,以供类在自己的构造函数中将它声明为依赖项:

public void ConfigureServices(IServiceCollection services)
{
   services.AddControllersWithViews();
   services.AddHttpContextAccessor();
   services.AddTransient<IUserRepository, UserRepository>();
}

如下示例中:

  • UserRepository 声明自己对 IHttpContextAccessor 的依赖。
  • 当依赖项注入容器解析依赖链并创建 UserRepository 实例时,就会注入依赖 项。
public class UserRepository : IUserRepository
{
  private readonly IHttpContextAccessor _httpContextAccessor;

  public UserRepository(IHttpContextAccessor httpContextAccessor)
  {
    _httpContextAccessor = httpContextAccessor;
  }

  public void LogCurrentUser()
  {
    var username = _httpContextAccessor.HttpContext.User.Identity.Name;
    service.LogAccessRequest(username);
  }
}

从后台线程访问 HttpContext

HttpContext 不是线程安全型。 在处理请求之外读取或写入 HttpContext 的属性可能会导致 NullReferenceException。

要使用 HttpContext 数据安全地执行后台工作,请执行以下操作:

  • 在请求处理过程中复制所需的数据。
  • 将复制的数据传递给后台任务。

要避免不安全代码,请勿将 HttpContext 传递给执行后台工作的方法。 而是传递所需要的数据。 在以下示例中,调用 SendEmailCore,开始发送电子邮件。 将 correlationId 传递到 SendEmailCore,而不是 HttpContext。 代码执行不会等待 SendEmailCore 完成:

public class EmailController : Controller
{
  public IActionResult SendEmail(string email)
  {
    var correlationId = HttpContext.Request.Headers["x-correlation-id"].ToString();

    _ = SendEmailCore(correlationId);

    return View();
  }

  private async Task SendEmailCore(string correlationId)
  {
    ...
  }
}

到此这篇关于在ASP.NET Core5.0中访问HttpContext的方法步骤的文章就介绍到这了,更多相关ASP.NET Core 访问 HttpContext内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NET Core中的Http缓存使用

    Http响应缓存可减少客户端或代理对web服务器发出的请求数.响应缓存还减少了web服务器生成响应所需的工作量.响应缓存由Http请求中的header控制. 而ASP.NET Core对其都有相应的实现,并不需要了解里面的工作细节,即可对其进行良好的控制. 了解Http缓存 Http协议中定义了许多缓存,但总体可以分为强缓存和协商缓存两类. 强缓存 强缓存是指缓存命中时,客户端不会向服务器发请求,浏览器F12能看到响应状态码为200,size为from cache,它的实现有以下几种方式: Ex

  • .Net Core下HTTP请求IHttpClientFactory示例详解

    使用方式 IHttpClientFactory有四种模式: 基本用法 命名客户端 类型化客户端 生成的客户端 基本用法 在 Startup.ConfigureServices 方法中,通过在 IServiceCollection 上调用 AddHttpClient 扩展方法可以注册 IHttpClientFactory services.AddHttpClient(); 注册之后可以像依赖注入DI似得在类中通过构造函数注入形式使用,伪代码: class A { private readonly

  • .NET Core使用HttpClient进行表单提交时遇到的问题

    问题# 在开发微信支付的小微商户进件接口时,需要通过表单来上传身份证图片等数据.在微信支付接口文档也说明了,需要使用 multipart/form-data 的方式发送请求..NET 提供了 MultipartFormDataContent 类型,帮助我们构建表单请求,故有以下代码: var form = new MultipartFormDataContent() { {new StringContent("Value"),"Name}, {new ByteArrayCon

  • 在ASP.NET Core中用HttpClient发送POST, PUT和DELETE请求

    在上一篇文章中,我们已经学习了如何在ASP.NET Core中使用HttpClient从Web API获取数据.此外,我们还学习了如何使用GetAsync方法和HttpRequestMessage类发送GET请求.在本文中,我们将学习如何在ASP.NET Core中使用HttpClient发送POST.PUT和DELETE请求,并使用PostAsync.PutAsync.DeleteAsync和HttpRequestMessage类创建请求. 在ASP.NET Core中使用HttpClient

  • .NET CORE HttpClient的使用方法

    前言 自从HttpClient诞生依赖,它的使用方式一直备受争议,framework版本时代产生过相当多经典的错误使用案例,包括Tcp链接耗尽.DNS更改无感知等问题.有兴趣的同学自行查找研究.在.NETCORE版本中,提供了IHttpClientFactory用来创建HttpClient以解决之前的种种问题.那么我们一起看一下它的用法. 使用方式 基本用法. 直接注入IHttpClientFactory 命名客户端.注入IHttpClientFactory并带有名称,适用于需要特定的客户端配置

  • 如何在 .NET 中使用 Flurl 高效处理Http请求

    简介 官方介绍,Flurl是一个现代的,流利的,支持异步的,可测试的,可移植的,URL增强和Http客户端组件. Url构建 现在有一个登录的接口,地址如下: https://www.some-api.com/login?name=Lee&pwd=123456 我们在处理这个地址的时候,会拼接 login,然后拼接?号,然后拼接参数,中间还要拼接& 得到最终的地址. 使用 Flurl 构建,首先需要通过 Nuget 安装 Flurl 组件. var url = "http://w

  • .net Core 使用IHttpClientFactory请求实现

    导读:本文已添加在 晨曦微服务之旅 ,现在自己在尝试微服务架构,一边学边做项目快速的进入状态.当然在学习的过程中会将自己学到的知识进行分享. 一.为什么不用HttpClient 1.HttPClient使用完之后不会立即关闭开启网络连接时会占用底层socket资源,但在HttpClient调用其本身的Dispose方法时,并不能立刻释放该资源 2.如果频繁的使用HttpClient,频繁的打开链接,关闭链接消耗就会很大. 二.解决方案 1.我们可以延长HttpClient的生命周期,比如对其建一

  • ASP.NET Core扩展库之Http日志的使用详解

    最佳实践都告诉我们不要记录请求的详细日志,因为这有安全问题,但在实际开发中,请求的详细内容对于快速定位问题却是非常重要的,有时也是系统的强力证据.Xfrogcn.AspNetCore.Extensions扩展库提供了服务端和客户端的详细日志功能,通过配置可以开启. 服务端日志通过请求中间件来完成,中间件会以Trace级别记录请求和应答详情,以Debug级别记录请求耗时.服务的请求日志的名称为ServerRequest.Logger 要开启服务端详情日志,只需将扩展库配置中的ServerReque

  • ASP.NET Core扩展库之Http通用扩展库的使用详解

    本文将介绍Xfrogcn.AspNetCore.Extensions扩展库对于Http相关的其他功能扩展,这些功能旨在处理一些常见需求, 包括请求缓冲.请求头传递.请求头日志范围.针对HttpClient与HttpRequestMessage.HttpResponseMessage的扩展方法. 一.开启服务端请求缓冲 ASP.NET Core 中请求体是不能多次读取的,由于在MVC中,框架已经读取过请求体,如果你在控制器中再次读取,将会引发异常,如下示例: [ApiController] [Ro

  • 在ASP.NET Core中应用HttpClient获取数据和内容

    在本文中,我们将学习如何在ASP.NET Core中集成和使用HttpClient.在学习不同HttpClient功能的同时使用Web API的资源.如何从Web API获取数据,以及如何直接使用HttpRequestMessage类来实现这些功能.在以后的文章中,我们将学习如何发送POST.PUT和DELETE请求,以及如何使用HttpClient发送PATCH请求. 要下载源代码,可以访问https://github.com/CodeMazeBlog/httpclient-aspnetcor

  • 如何在ASP.NET Core中使用HttpClientFactory

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. 为什么要使用 HttpClientFactory 可以用 HttpClientFactory 来集中化管理 HttpClient,工厂提供了对 HttpClient 的创建,配置和调度,值得一提的是:HttpClient 一直都是 Http 请求业务方面的一等公民. HttpClient 虽好,但它

随机推荐