前言

Web.Config 文件在 ASP.NET 中用于控制各个 ASP.NET 应用程序的行为并配置 IIS。默认情况下,现代 ASP.NET Core 应用程序使用 Kestrel Web 服务器,该服务器在代码中配置。除非您使用 IIS 部署应用程序,否则需要将 Web.Config 文件迁移到 ASP.NET Core。

Web.Config 文件包含有关包包含、模块包含和配置值的数据。

1. 包包含

在 ASP.NET Core 中,项目包含在项目的 CSPROJ 文件中列出。需要检查应用程序的依赖项是否仍然需要,并使用 NuGet 包管理器按需添加。

2. 服务器配置

服务器的配置需要转移到 Program.cs 文件中的代码里。

2.1 自定义错误页面

<system.web> 中的 <customErrors> 元素指定了服务器在生成具有 HTTP 错误代码的响应时要使用的重定向。如何是 ‘RemoteOnly’,这意味着重定向仅在从单独的主机访问时使用。<customErrors> 元素将提供默认重定向,并且可以包含 <error> 元素,为特定的错误代码提供更具体的重定向。

最简单的转换此配置的方法是使用 UseStatusCodePagesWithRedirects

<customErrors mode="RemoteOnly" defaultRedirect="~/Error">
    <error statusCode="403" redirect="~/Error?code=403" />
    <error statusCode="404" redirect="~/Error?code=404" />
</customErrors>

自定义错误重定向的典型示例

var app = builder.Build();
app.UseStatusCodePagesWithRedirects("/Error?code={0}");

迁移到 ASP.NET Core 的配置

2.2 命名空间

<pages>/<namespaces> 元素定义了在程序集预编译期间使用的导入指令。可以使用现代 C# 的隐式导入功能实现相同的效果。

3. HTTP 处理程序路由

<httpHandlers> 元素将路由链接到 IHttpHandler 实现。有关替换选项,请参阅 ASP.NET Core 基础知识文章关于路由,包括使用 MapGetMapPost

3.1 HTTP 模块

<httpModules> 元素配置了注册到 HttpApplication 的模块。有关各个模块的现代等效项如何与 ASP.NET Core 应用程序一起使用,请参阅各个模块的文档。

4. 自定义配置值

应用程序的自定义配置值存储在 <appSettings> 元素中。配置值的迁移位置取决于它们是否应该是机密。

对于非机密值,可以将它们迁移到 appsettings.json 文件中。

<appSettings>
    <add key="DefaultVisibility" value="public" />
    <add key="DefaultClientCount" value="30" />
</appSettings>

Web.config 中应用程序设置的典型示例

{
  "DefaultVisibility": "public",
  "DefaultClientCount": 30
}

迁移到 appsettings.json 的应用程序设置示例

如果程序正在使用 System.Configuration.ConfigurationManager 访问配置值,则需要更改该类的使用方式,因为该类在 ASP.NET Core 下不可用。相反,应使用来自 Microsoft.Extensions.Configuration 包的依赖注入 IConfiguration 实现。

String visibility = ConfigurationManager.AppSettings["DefaultVisibility"];
int clientCountStr = int.Parse(ConfigurationManager.AppSettings["DefaultClientCount"]);
// 使用配置值执行操作。

使用 ConfigurationManager 获取设置的典型示例

public class TestService
{
    private readonly IConfiguration Configuration;

    public TestService(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void Act() {
        var visibility = Configuration.GetValue<string>("DefaultVisibility");
        var clientCountStr = Configuration.GetValue<int>("DefaultClientCount");
        // 使用配置值执行操作。
    }
}

迁移到 ASP.NET Core 的示例代码

5. 连接字符串

连接字符串存储在 <connectionStrings> 元素中,只要不包含任何机密,就可以直接迁移到 appsettings.json 文件中。

<connectionStrings>
    <add name="DefaultConnection"
         providerName="System.Data.SqlClient"
         connectionString="Server=localhost,1200" />
</connectionStrings>

Web.config 中典型的连接字符串示例

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost,1200"
  }
}

迁移到 ASP.NET Core 的连接字符串示例

如上所述,ConfigurationManager 类不再可用,其用法需要替换为使用 IConfiguration 的调用。

var connStr = ConfigurationManager.ConnectionsStrings["DefaultConnection"]
                                  .ConnectionString;

从 Web.config 获取连接字符串的典型示例

var build = WebApplication.CreateBuilder(args);
var app = builder.Build();
var connStr = app.Configuration.GetConnectionString("DefaultConnection");

迁移到在 Program.cs 中获取连接字符串的示例