首页 / ASP.NET Core / 正文

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

3958 发布于: 2018-08-24 读完约需8分钟

问题描述

对于从事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>();
}

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [javascript]javascript中怎样获取URL中的查询参数字符串值(query string value),有哪些方法呢?

下一篇: [.NET Core].NET Core跨平台开发中如何在离线的情况下使用restore命令还原.NET Core项目的依赖包?

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

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册