我们当前正在使用ASP.NET Core重写/转换我们的ASP.NET WebForms应用程序。尽量避免重新设计。
我们HttpContext在类库中使用一节来检查当前状态。如何HttpContext.Current在.NET Core 1.0中访问?
HttpContext
HttpContext.Current
var current = HttpContext.Current; if (current == null) { // do something here // string connection = Configuration.GetConnectionString("MyDb"); }
我需要访问它以构建当前的应用程序主机。
$"{current.Request.Url.Scheme}://{current.Request.Url.Host}{(current.Request.Url.Port == 80 ? "" : ":" + current.Request.Url.Port)}";
通常,将Web窗体或MVC5应用程序转换为ASP.NET Core 将需要 大量的重构。
HttpContext.Current已在ASP.NET Core中删除。从单独的类库访问当前HTTP上下文是ASP.NET Core试图避免的混乱体系结构类型。有几种方法可以在ASP.NET Core中对其进行重新架构。
您可以通过HttpContext任何控制器上的属性访问当前HTTP上下文。与原始代码示例最接近的事情是将其传递HttpContext给您正在调用的方法:
public class HomeController : Controller { public IActionResult Index() { MyMethod(HttpContext); // Other code } } public void MyMethod(Microsoft.AspNetCore.Http.HttpContext context) { var host = $"{context.Request.Scheme}://{context.Request.Host}"; // Other code }
如果您正在为ASP.NET Core管道编写自定义中间件,则当前请求HttpContext将Invoke自动传递到您的方法中:
Invoke
public Task Invoke(HttpContext context) { // Do something with the current HTTP context... }
最后,您可以使用IHttpContextAccessor帮助程序服务来获取由ASP.NET Core依赖项注入系统管理的任何类中的HTTP上下文。当您拥有控制器使用的通用服务时,此功能很有用。
IHttpContextAccessor
在构造函数中请求此接口:
public MyMiddleware(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; }
然后,您可以以安全的方式访问当前的HTTP上下文:
var context = _httpContextAccessor.HttpContext; // Do something with the current HTTP context...
IHttpContextAccessor默认情况下并不总是将其添加到服务容器中,因此ConfigureServices为了安全起见将其注册:
ConfigureServices
public void ConfigureServices(IServiceCollection services) { services.AddHttpContextAccessor(); // if < .NET Core 2.2 use this //services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); // Other code... }