ASP.NET Core开发之HttpContext

ASP.NET Core中的HttpContext开发,在ASP.NET开发中咱们老是会常常用到HttpContext。app

那么在ASP.NET Core中要如何使用HttpContext呢,下面就来具体学习ASP.NET Core HttpContext。学习

注入HttpContextAccessor

ASP.NET Core中提供了一个IHttpContextAccessor接口,HttpContextAccessor 默认实现了它简化了访问HttpContext。ui

它必须在程序启动时在IServicesCollection中注册,这样在程序中就能获取到HttpContextAccessor,并用来访问HttpContext。this

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

获取HttpContextAccessor

下面来实际作一个操做,获取 HttpContextAccessor。spa

新建一个ASP.NET Core Web 应用程序,选择Web 应用程序。 身份验证勾选为不进行身份验证。code

而后在HomeController 加入以下代码:中间件

public class HomeController : Controller
    {
        private IHttpContextAccessor _accessor;
        public HomeController(IHttpContextAccessor accessor)
        {
            _accessor = accessor;
        }
        public IActionResult Index()
        {
            var httpcontext = _accessor.HttpContext;
            return View();
        }
    }

这样就能获取到 HttpContext对象

public IActionResut Index()
{
   var httpConetext = _accessor.HttpContext;
   return View();  
}

运行之后就能获取到 HttpContext 对象。上面也说到,必须在程序启动时注入才能获取到HttpContextAccessor。blog

那么新建的程序是在哪注入的呢。接口

这里就是在 

public void ConfigureServices(IServiceCollection services)
{
   // Add framework services.
   services.AddMvc();
}

services.AddMvc() 中注入。

实现HttpContext.Current

你们在ASP.NET 中大量用 HttpContext.Current获取HttpContext ,如今ASP.NET Core已经不这么作了。

不过若是你仍是想用静态  HttpContext.Current ,下降迁移旧程序的成本,仍是能够实现的。

新建一个静态 HttpContext 类,

   public static class HttpContext
    {
        private static IHttpContextAccessor _accessor;

        public static Microsoft.AspNetCore.Http.HttpContext Current => _accessor.HttpContext;

        internal static void Configure(IHttpContextAccessor accessor)
        {
            _accessor = accessor;
        }
    }

而后接着再添加一个扩展类。

public static class StaticHttpContextExtensions
    {
        public static void AddHttpContextAccessor(this IServiceCollection services)
        {
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        }

        public static IApplicationBuilder UseStaticHttpContext(this IApplicationBuilder app)
        {
            var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
            HttpContext.Configure(httpContextAccessor);
            return app;
        }
    }

接着就能够在Startup 类中进行调用。

默认状况下若是在MVC项目中直接调用  UseStaticHttpContext() 便可。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.UseStaticHttpContext();

在没有注入 HttpContextAccessor的项目中,还需在ConfigureServices 方法中调用

services.AddHttpContextAccessor();

而后就能够在其余地方使用HttpContext.Current。

        public IActionResult Index()
        {
            var statichttpcontext = HttpContextDemo.HttpContext.Current;
            return View();
        }

这里演示的是在Controller 中调用,其实更多的是在其余地方调用,如中间件及一些本身写的Service。

Controller 中其实能够直接使用HttpContext,ControllerBase类中有一个HttpContext 属性。

相关文章
相关标签/搜索