如何在 ASP.NET Core 中实现设置页面?

How to implement a setup page in ASP.NET Core?

我想创建类似 Web 应用程序安装页面的内容。例如,用户可以在其中选择要使用的数据库(Microsoft SQL Server、Postgres 等)以便与数据库建立连接的页面。

您对如何实现这样的页面有什么想法吗?有这样的页面的项目吗?

这是一个非常广泛的问题,并且在很大程度上取决于您的应用程序。例如,您将连接字符串存储在哪里?您第一次访问它的时间和地点?不过,我可以提供有关如何处理此问题的广泛概述,以及一些可以帮助您入门的参考资料。

基本步骤

  1. 确定缺少配置数据
  2. 重定向到设置页面
  3. 从用户那里收集丢失的配置数据
  4. 将丢失的配置数据保存到您的配置存储
  5. 重定向回原来的

解决所有这些问题比 Stack Overflow 的任何一个答案都复杂,但我可以提供一些有助于解决最有可能遇到的障碍的建议。

拦截请求

第一个要求是检测配置数据是否丢失并重定向到设置页面。这通常是通过某种类型的 ASP.NET 核心 Middleware or Filter 完成的。中间件更灵活一些,因为它们可以更早发生并涵盖更广泛的请求范围,而过滤器更容易编写,因为它们可以轻松访问有关请求的更多上下文信息。

资源过滤器

一个常见的方法是创建一个 ASP.NET Core Resource Filter or that checks for the presence of key configuration resources—such as a connection string—and, if they’re not present, redirect the user to a setup page. A similar approach can be taken with .

异常过滤器

另一种方法是在每个需要配置变量但不存在的地方抛出自定义 UnconfiguredApplicationException。然后,使用 a custom Exception Filter, a custom Middleware component, or the existing UseExceptionHandler middleware 全局处理该异常。这需要更多代码,因为您必须在依赖配置数据的每个点添加检查,但不需要为每个请求主动验证配置数据。

实施

Microsoft documentation for filters 为资源和异常过滤器的基本构造提供了一些很好的指导。它还包括一个动作过滤器的示例,可以将其添加到任何控制器动作中以获得更精细的方法。

正在检测配置

如何检测未配置的应用取决于您存储配置变量的方式和位置。最常见的方法是使用 IConfiguration provider, such as appsettings.json, which can be combined with the Options Pattern. The ASP.NET Core Filter documentation offers a basic example of an options object (PositionOptions), mapped to an IConfiguration provider (appsettings.json), and configured using ASP.NET Core's Dependency Injection container.

设置页面

由于这通常是可再发行库的一部分,您的设置页面可能会通过 Razor Class Library 处理,它允许您将 Razor 视图和其他资产与您的库一起打包(例如,作为 NuGet 包).通常,您从用户那里收集特定于其安装的信息(例如用户名、密码和服务器名称),然后使用这些信息建立连接字符串,然后将其保存到配置源中。

正在检测数据库

如果您不知道数据库的类型,您通常会在设置页面中询问。不过,我想,您也可以遍历每个驱动程序,尝试根据提供的凭据进行连接,以确定哪个驱动程序成功。但是配置应用程序的人应该知道他们安装的是什么类型的数据库服务器!

结论

如顶部所述,这是一个非常宽泛的问题,并且有很多变化的部分。不过,这应该有助于您入门,并让您熟悉此过程中涉及的主要组件,例如 ASP.NET Core Filters, the ASP.NET Core Configuration System、&c.