[ASP.NET Core]在ASP.NET Core跨平台应用程序开发中如何访问http请求的的上下文(HttpContext)?

ASP.NET Core 作者: Rector 26阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

对于从事ASP.NET应用程序(ASP.NET Core以前的版本,Winform,ASP.NET MVC)开发的朋友们来说,访问http请求的上下文—HttpContext是比较简单的。是一个静态类,在ASP

例如,在ASP.NET MVC应用程序开发中,我们可以通过System.Web.MVC.HttpContext来轻松访问当前请求的上下文对象,它
是一个静态类,其中包含了当前http请求的所有信息。

但在ASP.NET Core(2.1 以前的版本中)的跨平台应用程序开发中,是没有提供HttpContext这个静态类的。所以,我们在ASP.NET Core的开发中是不能直接访问到当前请求的信息的。

那么,应该如何在ASP.NET Core(2.1 以前的版本中)的跨平台应用程序开发中实现类型ASP.NET MVC中的HttpContext对象呢?

方案一

正如问题描述中的,ASP.NET Core(2.1 以前的版本中)是没有了HttpContext,自然也不能通过HttpContext.Current这获取当前请求的上下文信息了,但是ASP.NET Core中提供了一个新的接口:IHttpContextAccessor,我们可以通过实现自己的IHttpContextAccessor类并完成依赖注入后,访问当前请求的上下文,如下:

public class MyComponent : IMyComponent
{
    private readonly IHttpContextAccessor _contextAccessor;

    public MyComponent(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    public string GetDataFromSession()
    {
        return _contextAccessor.HttpContext.Session.GetString(*KEY*);
    }
}

方案二

如果你使用的是ASP.NET Core 2.1或者更高的版本,那么,微软官方又提供了IHttpContextAccessor默认的实现:HttpContextAccessor类,在一个服务中,我们仅需要调用IHttpContextAccessor接口即可。比如:

a.在Razor Page中使用HttpContext属性:

public class AboutModel : PageModel
{
    public string Message { get; set; }

    public void OnGet()
    {
        Message = HttpContext.Request.PathBase;
    }
}

b.在Razor视图中使用HttpContext:

@{
    var username = Context.User.Identity.Name;
}

c.在ASP.NET Core MVC的控制器中使用HttpContext:

public class HomeController : Controller
{
    public IActionResult About()
    {
        var pathBase = HttpContext.Request.PathBase;
        // Do something

        return View();
    }
}

d.在一个中间件中使用HttpContext:

public class MyCustomMiddleware
{
    public Task InvokeAsync(HttpContext context)
    {
        // 调用context
    }
}

e.在自定义的组件中使用HttpContext:

比如有一个仓储的实现为:

public class UserRepository : IUserRepository
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserRepository(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void LogCurrentUser()
    {
        var username = _httpContextAccessor.HttpContext.User.Identity.Name;
        service.LogAccessRequest(username);
    }
}

其中:UserRepository这个仓储依赖于IHttpContextAccessor接口,那么我们需要在Startup中配置依赖关系和服务,如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    services.AddHttpContextAccessor();
    services.AddTransient<IUserRepository, UserRepository>();
}

阅读了该文章的人还浏览了...

本文永久链接码友网 » [ASP.NET Core]在ASP.NET Core跨平台应用程序开发中如何访问http请求的的上下文(HttpContext)?

发布于: 2018-08-24 17:30:56
分享扩散:

文章评论

获取验证码