原文链接:http://www.cnblogs.com/RainingNight/p/httpcontext-in-asp-net-core.html
HttpContext是ASP.NET中的核心对象,每一个请求都会创建一个对应的HttpContext对象,我们的应用程序便是通过HttpContext对象来获取请求信息,最终生成响应,写回到HttpContext中,完成一次请求处理。
1、 WebHost 在启动 IServer 时,会传入一个 IHttpApplication<TContext> 类型的对象,Server 负责对请求的监听,在接收到请求时,会调用该对象的 ProcessRequestAsync 方法将请求转交给我们的应用程序。
2、 首先使用 IHttpContextFactory
来创建 HttpContext 实例,然后在 ProcessRequestAsync
方法中调用上一章介绍的 RequestDelegate,由此进入到我们的应用程序当中。IHttpApplication<TContext>
的默认实现为 HostingApplication
,有如下定义:
public class HostingApplication : IHttpApplication<HostingApplication.Context> { private readonly RequestDelegate _application; private readonly IHttpContextFactory _httpContextFactory;
//创建httpcontext实例 public Context CreateContext(IFeatureCollection contextFeatures) { var context = new Context(); var httpContext = _httpContextFactory.Create(contextFeatures); _diagnostics.BeginRequest(httpContext, ref context); context.HttpContext = httpContext; return context; // } //调用 ProcessRequestAsync 方法将请求转交给我们的应用程序。 public Task ProcessRequestAsync(Context context) { return _application(context.HttpContext); } public void DisposeContext(Context context, Exception exception) { var httpContext = context.HttpContext; _diagnostics.RequestEnd(httpContext, exception, context); _httpContextFactory.Dispose(httpContext); _diagnostics.ContextDisposed(context); } }
<h3 id="a.-test-title">1.1 a. <code>test title</code></h3>
HttpContext
HttpContext 对象我们应该都很熟悉了,它用来表示一个抽象的HTTP上下文,而HttpContext对象的核心又体现在用于描述请求的Request和描述响应的Response属性上。
HttpRequest
HttpRequest 可以用来获取到描述当前请求的各种相关信息,比如请求的协议(HTTP或者HTTPS)、HTTP方法、地址,以及该请求的请求头,请求体等:HttpRequest是一个抽象类,它的默认实现是DefaultHttpRequest:
HttpResponse
在了解了表示请求的抽象类 HttpRequest
之后,我们再来认识一下与它对应的,用来描述响应的 HttpResponse
类型:HttpResponse也是一个抽象类,我们使用它来输出对请求的响应,如设置HTTP状态码,Cookies,HTTP响应报文头,响应主体等,以及提供了一些将响应发送到客户端时的相关事件。
IHttpContextAccessor
ASP.NET Core 中一切皆注入,更加推荐使用注入的方式来获取实例,而非使用静态变量。因此,ASP.NET Core 提供了一个 IHttpContextAccessor
接口,用来统一获取当前请求的 HttpContext 实例的方式:
public interface IHttpContextAccessor { HttpContext HttpContext { get; set; } }
ASP.NET Core 默认并没有注入 IHttpContextAccessor
对象,如果我们想在应用程序中使用它,则需要手动来注册:
public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); }
ASP.NET Core 使用 AsyncLocal<T>
来保证线程内的唯一实例。