ASP.NET Framework HttpApplicationHost

System.Web 适配器库使 ASP.NET Framework 应用程序能够使用 .NET 泛型主机模式,将新式应用程序基础结构功能引入传统 ASP.NET 框架项目。 此方法提供对新式 .NET 应用程序中标准的依赖项注入、日志记录、配置和其他服务的访问权限,同时保持与现有 ASP.NET Framework 代码的兼容性。

为何使用主机模式

在 ASP.NET Framework 应用程序中采用泛型主机模式提供了几个主要优势:

  • 依赖项注入:访问新式 .NET 中使用的内置依赖项注入容器,从而实现更好的可测试性、可维护性和关注点分离
  • 统一日志记录:与 Microsoft.Extensions.Logging应用程序集成,提供一致的日志记录体验并访问各种日志记录提供程序
  • 新式配置:使用新式 .NET 中的配置系统,包括对 JSON 文件、环境变量、用户机密和其他配置源的支持
  • 迁移路径:通过以增量方式采用新式模式来准备迁移到 ASP.NET Core 的代码库,同时维护现有的 ASP.NET Framework 应用程序
  • 服务默认值:利用新式 .NET 应用程序中常用的服务默认值和标准化应用程序基础结构模式

设置通用主机

若要在 ASP.NET Framework 应用中配置通用主机模式,请在 Global.asax.cs 文件的 Application_Start 方法中注册主机。

using System.Web;
using Microsoft.AspNetCore.SystemWebAdapters.Hosting;
using Microsoft.Extensions.Hosting;

namespace MvcApp
{
    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            HttpApplicationHost.RegisterHost(builder =>
            {
                builder.AddServiceDefaults();
                builder.AddSystemWebDependencyInjection();
                builder.AddSystemWebAdapters();
            });

            // Existing ASP.NET Framework configuration
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

该方法 HttpApplicationHost.RegisterHost 配置与 ASP.NET Framework 应用程序一起运行的泛型主机。 主机生成器通过添加各种功能的扩展方法接受配置。

依赖项注入

注释

该适配器目前处于预览版本。 必须使用 2.2.0-preview1.25554.5 或更高版本才能使用此功能。

该方法 AddSystemWebDependencyInjection 在整个 ASP.NET Framework 应用程序中启用依赖项注入。 向通用主机的服务集合注册的服务可供控制器、处理程序和其他组件使用。

此扩展方法是一种内部方法,将根据你引用的内容生成源。 支持以下框架:

注册服务

通过访问主机生成器上的 Services 属性,将服务注册到依赖注入容器中:

HttpApplicationHost.RegisterHost(builder =>
{    
    builder.AddSystemWebDependencyInjection();
    builder.AddSystemWebAdapters();

    builder.Services.AddScoped<IMyService, MyService>();
    builder.Services.AddSingleton<IDataRepository, DataRepository>();
});

有关如何自定义依赖项注入系统(包括替换服务容器)的详细信息,请参阅完整文档: ASP.NET Core 中的依赖项注入

如果当前在 ASP.NET Framework 中重写依赖注入钩子,您将需要更新为最新的依赖注入模式,并删除用于 WebForms/MVC4/WebAPI 的现有集成。

使用服务

注册后,可将服务注入到支持依赖项注入的 MVC 控制器、Web API 控制器和其他组件中:

public class HomeController : Controller
{
    private readonly IMyService _myService;
    private readonly ILogger<HomeController> _logger;

    public HomeController(IMyService myService, ILogger<HomeController> logger)
    {
        _myService = myService;
        _logger = logger;
    }

    public ActionResult Index()
    {
        _logger.LogInformation("Loading home page");
        var data = _myService.GetData();
        return View(data);
    }
}

在请求中,可以通过特殊扩展方法检索范围范围内的服务集:

var myService = HttpContext.Current.GetRequestServices().GetService(typeof(ISomeType));

警告

HttpContext 实现 IServiceProvider ,因此你可能会看到用于从中获取服务的扩展方法。 但是,它不是为了从已注册的容器中检索任何有用的服务而实现的。 如果您尝试使用它,您将看到一个错误,相反,您应该首先使用GetRequestServices()扩展方法。

伐木业

通用主机集成 Microsoft.Extensions.Logging,为 ASP.NET Framework 应用程序提供新式日志记录基础结构。

使用记录器

ILogger<T> 注入到你的类中以记录消息:

public class OrderService : IOrderService
{
    private readonly ILogger<OrderService> _logger;

    public OrderService(ILogger<OrderService> logger)
    {
        _logger = logger;
    }

    public void ProcessOrder(int orderId)
    {
        _logger.LogInformation("Processing order {OrderId}", orderId);
        
        try
        {
            // Process order logic
            _logger.LogDebug("Order {OrderId} processed successfully", orderId);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error processing order {OrderId}", orderId);
            throw;
        }
    }
}

有关自定义和使用日志记录的详细信息,包括与自己的提供程序集成,请参阅 .NET 中的日志记录和 ASP.NET Core

配置

通用主机支持新式 .NET 配置系统,包括 JSON 文件、环境变量和其他配置源。 默认情况下,使用HttpApplicationHost标准配置模式(如appsettings.jsonappsettings.{Environment}.json),并自动包含与AppSettingsConnectionStrings现有 ASP.NET Framework 应用程序兼容的值。

访问配置

注入 IConfiguration 以访问配置值:

public class EmailService : IEmailService
{
    private readonly string _smtpServer;
    private readonly ILogger<EmailService> _logger;

    public EmailService(IConfiguration configuration, ILogger<EmailService> logger)
    {
        _smtpServer = configuration["Email:SmtpServer"];
        _logger = logger;
    }

    public void SendEmail(string to, string subject, string body)
    {
        _logger.LogInformation("Sending email to {Recipient} via {SmtpServer}", to, _smtpServer);
        // Email sending logic
    }
}

对于无法使用依赖项注入的代码,请使用静态 AppConfiguration 帮助程序类访问配置值:

using Microsoft.AspNetCore.SystemWebAdapters;

var configValue = AppConfiguration.GetSetting("SomeSettings");
var connStr = AppConfiguration.GetConnectionString("connection-string-name");

这将适用于引用 Microsoft.AspNetCore.SystemWebAdapters 的 ASP.NET Core 和 ASP.NET Framework 应用程序,并提供对当前 IConfiguration 的访问权限。

使用选项模式

选项模式提供对配置部分的强类型访问:

public class EmailSettings
{
    public string SmtpServer { get; set; }
    public int Port { get; set; }
    public string Username { get; set; }
}

// Register options
HttpApplicationHost.RegisterHost(builder =>
{
    builder.Services.Configure<EmailSettings>(
        builder.Configuration.GetSection("Email"));

    builder.AddSystemWebDependencyInjection();
    builder.AddSystemWebAdapters();
});

// Consume options
public class EmailService : IEmailService
{
    private readonly EmailSettings _settings;
    private readonly ILogger<EmailService> _logger;

    public EmailService(IOptions<EmailSettings> options, ILogger<EmailService> logger)
    {
        _settings = options.Value;
        _logger = logger;
    }
}

有关高级配置方案,包括自定义配置源和环境特定的设置,请参阅 ASP.NET Core 中的配置

迁移策略

小型项目可能不需要完全转换为通用主机模式,但可以使大型项目的迁移更加容易。 如果您已成功转换为使用此功能,则可以在 ASP.NET Core 中将 HttpApplicationHost 的使用替换为 WebApplication

迁移到此设置时,小型增量更改将有助于确保成功转换。 建议在此进行迁移的顺序如下:

  1. 添加初始主机注册:

    HttpApplicationHost.RegisterHost(builder =>
    {
    });
    
  2. 更新以使用 Microsoft 扩展依赖注入:

    HttpApplicationHost.RegisterHost(builder =>
    {
        builder.AddSystemWebDependencyInjection();
    });
    

    在执行此操作时,可能需要根据容器自身的文档对其进行调整,以便与 Microsoft 扩展库的依赖注入集成。

  3. 确定日志记录系统并将其集成到Microsoft扩展日志记录基础结构中。 确定是否要继续使用现有系统中的记录器类型或迁移到 ILogger<> HttpApplicationHost 将提供的类型。

  4. 将所有调用AppSettingsConnectionStrings替换为新的等效AppConfiguration调用。 必须在要实现此操作的项目中引用 Microsoft.AspNetCore.SystemWebAdapters

  5. 开始使用选项模式将配置转换为 POCO,并通过集成 DI 系统将其传递给需要的服务。

  6. 将您的设置从 web.config 移动到 appsettings.json

其他资源