• 【转】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

    运行以后就能获取到 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();
            }

    public class MyService {     public void DoWork()     {         varcontext=HttpContext.Current;         // continue with context instance     } }

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

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

     转自:http://www.cnblogs.com/linezero/p/6801602.html

  • 相关阅读:
    Salesforce 大数据量处理篇(一)Skinny Table
    salesforce零基础学习(九十九)Salesforce Data Skew(数据倾斜)
    将博客搬至CSDN,新地址见此文章内容
    Spring Boot
    SpringBoot的模块及结构
    不建议现场注入– Spring IOC
    程序员健康指南
    如何使用Chrome DevTools花式打断点
    这堂课一上40年, 他告诉学生:就算你进了麻省理工, 不懂这个也很难成功!
    非对称加密算法--RSA加密原理
  • 原文地址:https://www.cnblogs.com/hycms/p/9763691.html
Copyright © 2020-2023  润新知