zoukankan      html  css  js  c++  java
  • ASP.NET Core开发之HttpContext

    ASP.NET Core中的HttpContext开发,在ASP.NET开发中我们总是会经常用到HttpContext。

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

    注入HttpContextAccessor

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

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

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    获取HttpContextAccessor

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

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

    然后在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。

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

    这里就是在 

    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 属性。

  • 相关阅读:
    HDU 2888 Check Corners (模板题)【二维RMQ】
    POJ 3264 Balanced Lineup(模板题)【RMQ】
    poj 3368 Frequent values(经典)【RMQ】
    SPOJ RPLN (模板题)(ST算法)【RMQ】
    UVA 796 Critical Links(模板题)(无向图求桥)
    UVA 315 Network (模板题)(无向图求割点)
    POJ 2029 Get Many Persimmon Trees (模板题)【二维树状数组】
    poj 3067 Japan 【树状数组】
    POJ 2481 Cows 【树状数组】
    POJ 1195 Mobile phones【二维树状数组】
  • 原文地址:https://www.cnblogs.com/sylone/p/11481446.html
Copyright © 2011-2022 走看看