问题描述
对于从事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>();
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册