ASP.NET Core 基础知识概述

Note

此版本不是本文的最新版本。 有关当前版本,请参阅 本文的 .NET 10 版本

Warning

此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 NET Core 支持策略。 有关当前版本,请参阅 本文的 .NET 10 版本

本文概述了生成 ASP.NET Core应用的基本原理,包括依赖项注入(DI)、配置和中间件。

有关补充或取代本文中的指南的 Blazor 基础知识指南,请参阅 ASP.NET Core Blazor 基础知识

Program 文件

使用该框架的项目模板创建的 ASP.NET Core 应用在 Program.cs 文件(Program)中包含启动代码。 Program 文件位于:

  • 已配置应用所需的服务。
  • 应用的请求处理管道定义为一系列 中间件组件

以下应用启动代码支持两种应用类型:

// Initialize a new instance of the WebApplicationBuilder class 
// with preconfigured defaults
var builder = WebApplication.CreateBuilder(args);

// Add services for Blazor (Razor components)
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

// Build the app
var app = builder.Build();

// Use exception-handling middleware and HSTS middleware
// when in the Development environment
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);

// Use HTTPS redirection middleware to automatically
// redirect requests from HTTP to HTTPS
app.UseHttpsRedirection();

// Map static assets endpoints
app.MapStaticAssets();

// Map a Minimal API endpoint for requests to '/hi'
app.MapGet("/hi", () => "Hello!");

// Add endpoints for Blazor
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

// Run the app
app.Run();

Note

通过在 Program 文件中进行其他配置,ASP.NET Core 应用可以支持 Razor PagesMVC带控制器的 Web API

以下应用启动代码支持两种应用类型:

// Initialize a new instance of the WebApplicationBuilder class 
// with preconfigured defaults
var builder = WebApplication.CreateBuilder(args);

// Add services for Blazor (Razor components)
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

// Build the app
var app = builder.Build();

// Use exception-handling middleware and HSTS middleware
// when in the Development environment
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);

// Use HTTPS redirection middleware to automatically
// redirect requests from HTTP to HTTPS
app.UseHttpsRedirection();

// Add antiforgery middleware
app.UseAntiforgery();

// Map static assets endpoints
app.MapStaticAssets();

// Map a Minimal API endpoint for requests to '/hi'
app.MapGet("/hi", () => "Hello!");

// Add endpoints for Blazor
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

// Run the app
app.Run();

Note

通过在 Program 文件中进行额外配置,ASP.NET Core 应用可以支持 Razor PagesMVC基于控制器的 Web API

以下应用启动代码支持多种应用类型:

// Initialize a new instance of the WebApplicationBuilder class 
// with preconfigured defaults
var builder = WebApplication.CreateBuilder(args);

// Add services for Blazor (Razor components), Razor Pages, and MVC
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

// Build the app
var app = builder.Build();

// Configure the HTTP request pipeline

// Use exception-handling middleware and HSTS middleware
// when in the Development environment
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

// Use HTTPS redirection middleware to automatically
// redirect requests from HTTP to HTTPS
app.UseHttpsRedirection();

// Use static files middleware to serve static assets
app.UseStaticFiles();

// Use authorization middleware
app.UseAuthorization();

// Add antiforgery middleware
app.UseAntiforgery();

// Map a Minimal API endpoint for requests to '/hi'
app.MapGet("/hi", () => "Hello!");

// Configures the standard conventional route for MVC
app.MapDefaultControllerRoute();

// Add endpoints for Razor Pages
app.MapRazorPages();

// Add endpoints for Blazor
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

// Run the app
app.Run();

以下应用启动代码支持:

// Initialize a new instance of the WebApplicationBuilder class 
// with preconfigured defaults
var builder = WebApplication.CreateBuilder(args);

// Add services for Razor Pages and MVC
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

// Build the app
var app = builder.Build();

// Configure the HTTP request pipeline

// Use exception-handling middleware and HSTS middleware
// when in the Development environment
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

// Use HTTPS redirection middleware to automatically
// redirect requests from HTTP to HTTPS
app.UseHttpsRedirection();

// Use static files middleware to serve static assets
app.UseStaticFiles();

// Use authorization middleware
app.UseAuthorization();

// Map a Minimal API endpoint for requests to '/hi'
app.MapGet("/hi", () => "Hello!");

// Configures the standard conventional route for MVC
app.MapDefaultControllerRoute();

// Add endpoints for Razor Pages
app.MapRazorPages();

// Run the app
app.Run();

Startup

StartupStartup.cs)位于以下位置:

  • 应用所需的服务是在 ConfigureServices 方法中配置的。
  • 应用的请求处理管道在方法中 Configure 定义为一系列 中间件组件

以下应用启动代码支持:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<RazorPagesMovieContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));

        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapDefaultControllerRoute();
            endpoints.MapRazorPages();
        });
    }
}

有关详细信息,请参阅 ASP.NET Core中的应用启动ASP.NET CoreBlazor启动

依赖关系注入(服务)

ASP.NET Core内置依赖项注入(DI)功能,使配置的服务在整个应用中都可用,以便进行控制反转(IoC)。

WebApplicationBuilder通过调用WebApplication.CreateBuilder实例化时,会自动添加框架提供的服务,例如用于配置和日志记录的服务:

var builder = WebApplication.CreateBuilder(args);

使用 WebApplicationBuilder.Services 将其他服务添加到 DI 容器中。 以下示例注册 Blazor 服务:

builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();
builder.Services.AddServerSideBlazor();

DI 框架在运行时提供所请求服务的实例。 在Blazor应用中,服务通常在运行时通过 DI 使用 Razor 组件文件(.razor)中的@inject指令进行解析。 在以下示例中,组件使用 NavigationManager 抽象来获取导航管理器的实例,该管理器用于查询和管理 URI 导航,以便在选择按钮时将用户导航到产品 /products 页:

@inject NavigationManager Navigation

<button @onclick="NavigateToProductList">
    Products
</button>

@code {
    private void NavigateToProductList()
    {
        Navigation.NavigateTo("/products");
    }
}

从 DI 解析服务的另一种方法是使用构造函数注入。 在下面的示例中,主构造函数(C# 12 或更高版本)接受类型为 AppDbContextILogger<OrderProcessor> 的参数,并在运行时将它们解析为 contextlogger 变量(数据库和日志记录抽象的实例)。 数据库上下文实例用于处理数据库中 false 字段为 IsProcessed 的所有订单,并使用记录器实例将每个已处理的订单及其订单 ID(OrderId)记录为信息日志:

public class OrderProcessor(AppDbContext context, ILogger<OrderProcessor> logger)
{
    public async Task ProcessPendingOrdersAsync()
    {
        var orders = await context.Orders
            .Where(o => !o.IsProcessed)
            .ToListAsync();

        foreach (var order in orders)
        {
            order.IsProcessed = true;
            logger.LogInformation("Processed order ID {OrderId}.", order.Id);
        }

        await context.SaveChangesAsync();
    }
}

也可以将依赖项直接注入到 Minimal API 终结点的 lambda 参数中。 在以下示例中,从 /todos 终结点返回待办事项列表。 用于记录信息的 ILogger<Program> 的日志记录器实例,以及用于从数据库中获取待办事项列表并在响应中返回的 AppDbContext 的数据库实例:

app.MapGet("/todos", async (AppDbContext context, ILogger<Program> logger) =>
{
    logger.LogInformation("Fetching todos using inline handler injection.");
    var todos = await context.Todos.ToListAsync();

    return Results.Ok(todos);
});

当在 文件中调用 Host.CreateDefaultBuilder 时,系统会自动使用 Program(例如配置和日志记录等服务)初始化一个新的 HostBuilder 类实例:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Startup.cs 方法(Startup.ConfigureServices)中,其他服务会被添加到 DI 容器的服务集合(IServiceCollection)中。 以下示例注册 MVC 和 Razor Pages 服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();
}

通常使用构造函数注入从 DI 解析服务。 通过构造函数注入,有一个类声明请求的类型或接口的构造函数参数。 DI 框架在运行时提供服务的实例。

如果内置 DI 容器不满足需求,则可以改用第三方 IoC 容器。

有关详细信息,请参阅 ASP.NET Core中的依赖关系注入ASP.NET CoreBlazor依赖项注入

Environments

ASP.NET Core中提供了执行环境,例如:

  • Development:当应用处于本地开发环境中时。
  • Staging:当应用准备部署时。
  • Production:当在线应用面向用户运行时。

通过在运行应用的主机上设置 ASPNETCORE_ENVIRONMENT 环境变量来指定应用正在运行的环境。 ASP.NET Core读取应用启动时的环境变量,并存储用于控制应用周围的代码执行的值。

开发人员代码可以检查给定环境。 在以下 Program 文件示例中,执行块中的代码仅在应用未在 Development 环境中运行时运行:

if (!app.Environment.IsDevelopment())
{
    ...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (!env.IsDevelopment())
    {
        ...
    }

    ...
}

有关详细信息,请参阅 ASP.NET Core运行时环境和ASP.NET CoreBlazor环境

Middleware

请求处理管道由一系列中间件组件组成。 每个组件在 HttpContext 上执行操作,调用管道中的下一个中间件或终止请求。

按照约定,中间件组件通过调用以“”Use开头的扩展方法添加到管道。在下面的示例中,调用请求处理管道的一部分、异常处理(UseExceptionHandler)、HTTP 严格传输安全性(HSTS)协议(UseHsts)和 HTTPS 重定向(UseHttpsRedirection)的中间件。 仅当应用未在本地开发环境(Development)中运行时,其中两个中间件才会被触发;例如,当应用处于预发布部署环境(Staging)或生产环境(Production)时:

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    app.UseHsts();
}

app.UseHttpsRedirection();
if (env.IsDevelopment())
{
    ...
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

ASP.NET Core 包含一组丰富的内置中间件。 还可以创建自定义中间件组件以满足应用的特殊请求处理规范。 有关详细信息,请参阅 ASP.NET Core中间件

Host

启动时,ASP.NET Core 应用将生成 主机。 主机封装应用的所有资源,例如:

  • HTTP 服务器实现
  • 中间件组件
  • Logging
  • 依赖关系注入 (DI) 服务
  • Configuration

有三个不同的主机能够运行 ASP.NET Core 应用:

建议使用 ASP.NET CoreWebApplicationWebApplicationBuilder类型,并用于所有 ASP.NET Core项目模板。 WebApplication 的行为类似于 .NET 泛型主机,并公开许多相同的接口,但需要更少的回调进行配置。 ASP.NET CoreWebHost仅适用于向后兼容性。

以下示例实例化 WebApplication 并将其分配给名为 app的变量:

var builder = WebApplication.CreateBuilder(args);

...

var app = builder.Build();

该方法 WebApplicationBuilder.Build 使用一组默认选项配置主机,例如:

  • 使用 Kestrel 作为 Web 服务器,并启用 IIS 集成。
  • 从应用设置文件(例如,appsettings.json环境变量、命令行参数和其他配置源)加载配置
  • 设置日志记录并将日志记录输出定向到控制台并调试日志记录提供程序。

有两个主机:

建议使用 .NET 通用主机。 ASP.NET Core Web 主机仅适用于向后兼容性。

以下示例中的 CreateDefaultBuilderConfigureWebHostDefaults 方法使用一组默认选项来配置主机,例如:

  • 使用 Kestrel 作为 Web 服务器,并启用 IIS 集成。
  • 从应用设置文件(例如,appsettings.json环境变量、命令行参数和其他配置源)加载配置
  • 设置日志记录并将日志记录输出定向到控制台并调试日志记录提供程序。
public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

有关详细信息,请参阅以下资源:

非网页场景

泛型主机允许其他类型的应用使用交叉框架扩展,例如日志记录、依赖项注入(DI)、配置和应用生存期管理。 有关详细信息,请参阅 ASP.NET Core 中的 .NET 通用主机ASP.NET Core 中使用托管服务的后台任务

Servers

ASP.NET Core 应用使用 HTTP 服务器实现侦听 HTTP 请求。 服务器对应用的请求在表面上呈现为一组由 组成的HttpContext

有关详细信息,请参阅 ASP.NET Core 中的 Web 服务器实现

Windows操作系统

ASP.NET Core 提供以下服务器实现:

  • Kestrel 是跨平台 Web 服务器。 Kestrel 通常使用 IIS 在反向代理配置中运行。 在 ASP.NET Core 2.0 或更高版本中,Kestrel 可作为面向公众的边缘服务器运行,直接向 Internet 公开。
  • IIS HTTP 服务器适用于使用 IIS 的 Windows。 借助此服务器,ASP.NET Core 应用和 IIS 在同一进程中运行。
  • HTTP.sys 是未用于 IIS 的 Windows 服务器。

macOS 和 Linux

ASP.NET Core 提供 Kestrel 跨平台服务器实现。 在 ASP.NET Core 2.0 或更高版本中,Kestrel 可作为面向公众的边缘服务器运行,直接向 Internet 公开。 Kestrel 通常使用 NginxApache 在反向代理配置中运行。

Configuration

ASP.NET Core提供了一个配置框架,该框架从一组有序的配置提供程序中获取名称-值对的设置。 内置配置提供程序可用于各种源,例如 JSON 文件(.json)、XML 文件(.xml)、环境变量和命令行参数。 可以创建自定义配置提供程序以支持其他源。

默认情况下,ASP.NET Core应用配置为从应用设置文件(例如)、appsettings.json环境变量和命令行读取。

加载应用配置后,环境变量中的值将替代应用设置文件中的值。 选项 API 可用于读取相关的配置值。

为了管理机密配置数据(如环境中的密码 Development ),.NET 提供 机密管理器。 对于生产机密,建议使用Azure 密钥保管库

有关详细信息,请参阅以下资源:

Logging

ASP.NET Core支持适用于各种日志记录提供程序的日志记录 API:

  • Console
  • Debug
  • Windows 事件跟踪
  • Windows 事件日志
  • TraceSource
  • Azure App 服务
  • Azure 应用洞察
  • 第三方提供程序

若要创建日志,请从依赖项注入(DI)解析 ILogger<TCategoryName> 服务并调用日志记录方法,例如 LogInformation。 调用 WebApplication.CreateBuilder 方法时,记录器对象及其控制台提供程序会自动注册到 DI 容器中。

以下示例演示如何从 DI 获取日志记录器实例,并在报告天气数据的 Blazor 应用的 Weather 组件(Weather.razor)中使用它:

@inject ILogger<Weather> Logger

...

@code {
    protected override async Task OnInitializedAsync()
    {
        Logger.LogInformation("OnInitializedAsync method called!");

        ...
    }
}

有关更多信息,包括有关 Razor Pages 和 MVC 应用的路由指导,请参阅 .NET 和 ASP.NET Core 中的日志记录 以及 ASP.NET Core Blazor 日志记录

Routing

ASP.NET Core中的路由是将传入请求映射到应用中特定终结点的机制。 它使你能够定义对应于不同组件的 URL 模式,例如 Razor 组件、Razor 页、MVC 控制器操作或中间件。

UseRouting 方法将路由中间件添加到请求管道。 此中间件处理路由信息并确定每个请求的相应终结点。 在使用 最小主机的应用中,除非你想要更改中间件处理顺序, UseRouting 否则不会在开发人员代码中显式调用。

有关详细信息,请参阅以下资源:

处理错误

ASP.NET Core 具有用于处理错误的内置功能,例如:

  • 开发人员异常页
  • 自定义错误页
  • 静态状态代码页
  • 启动异常处理

有关详细信息,请参阅处理 ASP.NET Core中的错误,以及处理 ASP.NET CoreBlazor应用中的错误

发出 HTTP 请求

IHttpClientFactory 的实现可用于创建 HttpClient 实例。 工厂:

  • 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例。 例如,对于大多数应用的数据请求,使用 Web API 依赖默认客户端,并注册其他配置的客户端来访问GitHub。
  • 支持多个委托处理程序的注册和链接,以生成出站请求中间件管道。 此模式类似于 ASP.NET Core 的入站中间件管道。 此模式提供了一种用于管理 HTTP 请求相关问题的机制,包括缓存、错误处理、序列化以及日志记录。
  • Polly 集成,这是用于暂时性故障处理的热门第三方库。
  • 管理基础 HttpClientHandler 实例的池和生存期,避免手动管理 HttpClient 生存期时可能出现的常见 DNS 问题。
  • 通过 ILogger 添加可配置的日志记录体验,用于记录通过工厂创建的客户端发送的所有请求。

有关详细信息,请参阅使用 IHttpClientFactory 的 HTTP 请求 - ASP.NET Core并从 ASP.NET CoreBlazor应用调用 Web API

内容根目录

内容根目录是指向以下内容的基路径:

  • 托管应用的可执行文件(.exe)。
  • 组成应用的已编译程序集(.dll)。
  • 应用使用的内容文件,例如 Razor 文件(.cshtml.razor)、配置文件(.json.xml数据文件)和数据文件(.db)。
  • Web 根目录通常是 wwwroot 文件夹。

在开发中,内容根目录默认为项目的根目录。 此目录也是应用内容文件和 Web 根目录的基本路径。 通过在生成 主机时设置其路径来指定其他内容根目录。

有关详细信息,请参阅 ASP.NET Core 中的.NET泛型主机,并在 ASP.NET Core 应用中提供静态文件

网站根目录

Web 根是公共静态资源文件(如样式表、JavaScript 文件和图像)的基本路径。

默认情况下,静态文件仅从 Web 根目录及其子目录提供。 Web 根路径默认为 {CONTENT ROOT}/wwwroot,其中 {CONTENT ROOT} 占位符为内容根目录。 在构建主机时设置路径,可指定不同的 Web 根目录。 还可以在应用的项目文件中使用 wwwroot 来阻止在 <Content> 中发布文件。

在 Razor.cshtml 文件中,~/ 指向 Web 根。 以~/虚拟路径开头的路径称为虚拟路径

有关详细信息,请参阅 ASP.NET Core 中的.NET泛型主机,并在 ASP.NET Core 应用中提供静态文件

如何下载示例

很多文章和教程中都包含有示例代码链接。

  1. 下载 ASP.NET 存储库 zip 文件
  2. 解压缩 AspNetCore.Docs-main.zip 文件。
  3. 若要在解压缩的存储库中访问文章的示例应用,请借助文章的示例链接中的 URL 来导航到示例文件夹。 通常,文章的示例链接显示在文章顶部,链接文本为“查看或下载示例代码”。

若要获取单个示例应用,并且仅获取其最后一次提交,请使用 git sparse-checkout

在以下示例中,Blazor示例GitHub存储库中,git sparse-checkout set该命令指定示例文件夹的路径:

  • {VERSION FOLDER} 占位符替换为版本文件夹。
  • {SAMPLE FOLDER} 占位符替换为示例文件夹。

在命令 shell 中,导航到要克隆示例的文件夹。 在命令行界面中执行以下命令,将 version/sample 文件夹路径传递给 git sparse-checkout set 命令:

git clone --depth 1 --filter=blob:none https://github.com/dotnet/blazor-samples.git --sparse
cd blazor-samples
git sparse-checkout init --cone
git sparse-checkout set {VERSION FOLDER}/{SAMPLE FOLDER}

以下 PowerShell 示例获取 10.0 Blazor Web App 示例,并使用 PowerShell ~/documents 的更改目录 (cd) 命令的路径将其置于用户的文档文件夹中:

cd "~/documents"
git clone --depth 1 --filter=blob:none https://github.com/dotnet/blazor-samples.git --sparse
cd blazor-samples
git sparse-checkout init --cone
git sparse-checkout set 10.0/BlazorSample_BlazorWebApp

示例代码中的预处理器指令

为了演示多个方案,示例应用使用 #define#if-#else/#elif-#endif 预处理器指令选择性地编译和运行示例代码中不同的片段。 对于那些利用此方法的示例,请将 C# 文件顶部的 #define 指令设置为定义与你想要运行的方案相关联的符号。 一些示例要求在多个文件的顶部定义符号才能运行方案。

例如,以下 #define 符号列表指示四个方案可用(每个符号一个方案)。 当前示例配置运行 TemplateCode 方案:

#define TemplateCode // or LogFromMain or ExpandDefault or FilterInCode

若要更改示例以运行 ExpandDefault 方案,请定义 ExpandDefault 符号并保留剩余的符号处于被注释掉的状态:

#define ExpandDefault // TemplateCode or LogFromMain or FilterInCode

若要详细了解如何使用 C# 预处理器指令选择性地编译代码段,请参阅 #define(C# 参考)#if(C# 参考)

示例代码中的区域

一些示例应用包含 #region#endregion C# 指令包围的代码部分。 文档生成系统将这些区域注入到呈现的文档主题中。

区域名称通常包含“代码段”一词。以下示例显示了名为 snippet_WebHostDefaults 的区域:

#region snippet_WebHostDefaults
Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
    });
#endregion

前面的 C# 代码片段在主题的 markdown 文件中使用以下行引用:

[!code-csharp[](sample/SampleApp/Program.cs?name=snippet_WebHostDefaults)]

可以安全地忽略或删除围绕代码的 #region#endregion 指令。 如果打算运行本主题中所述的示例方案,请不要更改这些指令中的代码。

有关详细信息,请参阅 参与 ASP.NET 文档:代码片段

文档对象模型 (DOM)

在整套文档中,提及 文档对象模型 时,均使用缩写 DOM

有关详细信息,请参阅 DOM(MDN 文档)级别 1 文档对象模型规范(W3C)简介。

字节倍数

.NET 字节大小使用基于 1024 的幂的非十进制字节倍数的国际单位制词头。

名称(缩写) Size Example
千字节 (KB) 1,024 字节 1 KB = 1,024 字节
兆字节 (MB) 1,0242 字节 1 MB = 1,048,576 字节
千兆字节 (GB) 1,0243 字节 1 GB = 1,073,741,824 字节

支持请求

仅与文档相关的问题适用于 dotnet/AspNetCore.Docs 存储库。 对于产品支持,不要打开文档问题。请通过以下一个或多个支持渠道寻求帮助:

关于框架或产品反馈中的潜在 bug,请在 dotnet/aspnetcore 问题中为 ASP.NET Core 产品开放一个问题。 错误报告通常需要以下内容:

  • 问题的说明:按照产品单位在打开问题时提供的GitHub问题模板中的说明进行操作。
  • 最小重现项目:将项目放在 GitHub,供产品团队工程师下载和运行。 将项目交叉链接到问题的开头评论。

如果发现某篇文章可能存在问题,请提交文档问题。 若要打开文档问题,请使用文章底部的打开文档问题反馈链接。 添加到问题中的元数据会提供追踪数据,并自动通知文章的作者。 如果在打开文档问题之前已与产品单位讨论过该主题,请在文档问题的开始注释中放置工程问题的交叉链接。

GitHubBlazor 文档相关的问题会自动标记为待分类,归入Blazor.Docs项目(dotnet/AspNetCore.Docs GitHub 仓库)。 请等待回复,尤其是在周末和节假日。 通常,文档作者会在工作日的 24 小时内回复。

有关Visual Studio的问题或反馈,请在Visual Studio中使用报告问题建议新功能选项,以打开Visual Studio的内部问题。 有关详细信息,请参阅 Visual Studio Feedback

有关Visual Studio Code问题,请在社区支持论坛上请求支持。 对于 bug 报告和产品反馈,请在 microsoft/vscode GitHub 存储库上提出问题。

其他资源