使用API向ASP.NET Core应用程序运行时添加新端点...

作者:API传播员 · 2025-11-03 · 阅读时间:5分钟

最近,我在博客中分享了关于 API 框架的内容,这是一个开源项目,旨在让构建 ASP.NET Core 后端更加灵活。API 框架的核心功能之一是能够在运行时向后端添加新端点,而无需重建和重新启动系统。本文将详细介绍如何实现这一目标。


目标

我们的目标是创建一个基于 ASP.NET Core 的应用程序,用户可以通过 UI(用户界面)动态添加新的端点。同时,添加的端点会自动更新后端的 OpenAPI 文档。

源代码

本文的完整源代码可以在 GitHub 上找到:GitHub 项目地址


添加 API 框架

首先,我们需要在项目中添加 API 框架和相关依赖项。以下是需要添加的 NuGet 包:


  
  

配置服务

Startup.cs 文件中,修改 ConfigureServices 方法,添加 Razor Pages、Blazor、控制器支持以及 API 框架和 OpenAPI 文档支持:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();

    services.AddControllers();
    services.AddApiFramework();
    services.AddOpenApiDocument();
}

配置中间件

接下来,在 Configure 方法中配置中间件,确保控制器、静态文件、OpenAPI 和 Swagger UI 的支持:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseDeveloperExceptionPage();

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseOpenApi();
    app.UseSwaggerUi3();

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

运行应用程序后,虽然表面上看不到任何变化,但如果导航到 /swagger,可以看到当前没有任何端点。


构建 API

在 API 框架中,API 是一个可重用的组件,包含名称、版本和特定功能。API 可以通过普通的 C# 类构建,甚至可以使用委托或 Roslyn 脚本等工具。

示例:Hello World API

以下是一个简单的 Hello World API 示例:

public class HelloWorldApi
{
    public string SayHello()
    {
        return "Hello from AF!";
    }
}

此时,API 本身还无法通过 HTTP 访问。我们需要从 API 创建一个或多个端点,才能通过 HTTP 调用这些功能。

自动注册 API

为了简化操作,可以让 API 框架自动注册 API。通过以下配置启用自动注册功能:

services.AddApiFramework(options =>
{
    options.AutoResolveApis = true;
});

现在,我们的 API 已经被注册到框架的 API 目录中,但尚未创建任何端点,因此运行应用程序时仍然没有新功能。


创建用户界面

接下来,我们需要构建一个用户界面,用于动态添加端点。

列出 API 目录

首先,创建一个新的 Razor 组件 EndpointManagement.razor,用于显示 API 目录中的所有 API:

@using Weikio.ApiFramework.Abstractions

@code {
    [Inject]
    IApiProvider ApiProvider { get; set; }

    protected override void OnInitialized()
    {
        base.OnInitialized();
    }
}

将该组件添加到 Index.cshtml 页面中:

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

运行应用程序后,API 目录表可能为空,这是因为目录的初始化是在后台线程中完成的。刷新页面后,应该可以看到 API 列表。


动态创建端点

为了实现动态创建端点的功能,我们需要使用 IEndpointManager 接口。以下是实现步骤:

定义端点

端点需要包含路由和 API 定义,并可以包含额外的配置。例如:

var endpoint = new EndpointDefinition(EndpointRoute, SelectedApi);

添加端点到系统

使用 CreateAndAdd 方法将端点添加到系统中:

EndpointManager.CreateAndAdd(endpoint);

更新端点

最后,调用 Update 方法,使新端点生效:

EndpointManager.Update();

以下是完整的 Create 方法实现:

private void Create()
{
    var endpoint = new EndpointDefinition(EndpointRoute, SelectedApi);

    EndpointManager.CreateAndAdd(endpoint);

    EndpointManager.Update();
}

运行应用程序后,可以通过 UI 选择 API,输入路由(例如 /test),然后点击创建按钮。新端点会立即生效。


测试端点

创建端点后,可以通过浏览器访问新端点。例如,访问 /api/test,应该可以看到返回的内容。同时,导航到 /swagger,可以看到新的端点已经出现在 OpenAPI 文档中。


结论

通过本文的介绍,我们成功地在一个基于 ASP.NET Core 3.1 的应用程序中实现了运行时动态添加端点的功能,而无需重建或重启应用程序。完整代码可以在 GitHub 上获取。

未来,我们可以基于此功能进一步扩展,例如:

  • 动态删除端点
  • 从需要配置的 API 创建端点
  • 列出和查看端点状态
  • 动态创建 API
  • 从 NuGet 包分发的 API 创建端点

通过这些功能,API 框架为 ASP.NET Core 后端开发提供了极大的灵活性和扩展性。

原文链接: https://mikaelkoskinen.net/post/aspnet-core-runtime-changes-new-endpoint