原文链接:http://www.cnblogs.com/RainingNight/p/httpcontext-in-asp-net-core.html
HttpContext是ASP.NET中的核心对象,每一个请求都会创建一个对应的HttpContext对象,我们的应用程序便是通过HttpContext对象来获取请求信息,最终生成响应,写回到HttpContext中,完成一次请求处理。
1、 WebHost 在启动 IServer 时,会传入一个 IHttpApplication
2、 首先使用 IHttpContextFactory
来创建 HttpContext 实例,然后在 ProcessRequestAsync
方法中调用上一章介绍的 RequestDelegate,由此进入到我们的应用程序当中。IHttpApplication
的默认实现为 HostingApplication
,有如下定义:
public class HostingApplication : IHttpApplication{ 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); } }
1.1 a. test title
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(); }
ASP.NET Core 使用 AsyncLocal
来保证线程内的唯一实例。