我已经在IIS和Nginx中部署了我的.Net核心代码.有没有什么方法可以限制用户不使用特定的API并且不再部署代码?

或者,如果我必须再次部署,有什么方法可以限制用户,使他们不能使用该API?

推荐答案

如果我理解你的问题是正确的,你可以使用功能标志,.NET有一个内置的工具,允许你激活或停用给定的控制器或控制器操作,并通过你的应用程序设置来完成,而不需要更改和部署任何代码.

您可以通过以下方式执行此操作:

将服务添加到您的应用程序中的启动、程序或配置服务的任何位置:

using Microsoft.FeatureManagement;      

builder.Services.AddFeatureManagement();

您可以将您的功能标志添加到appsettings.json中,这样您就可以在不接触代码的情况下轻松地进行更改,连接到您的appsets功能标志配置:

using Microsoft.Extensions.Configuration.AzureAppConfiguration;

var builder = WebApplication.CreateBuilder(args);

builder.Configuration.AddAzureAppConfiguration(options =>
    options.Connect(
        builder.Configuration["ConnectionStrings:AppConfig"])
        .UseFeatureFlags());

我发现,使用内置的特性管理json属性,上面的方法更简单,但您也可以定义自己的特性并通过GetSection访问它,我不会在这里详细介绍.

然后,您应该将其添加到您的中间件中的应用程序:

builder.Services.AddAzureAppConfiguration();

app.UseAzureAppConfiguration();

和appsettings.json:

{"FeatureManagement": {
        "FeatureA": true, // Feature flag set to on
        "FeatureB": false, // Feature flag set to off
        }
    }
}

您还可以声明一些静态类来添加您的设置名称,以便于在整个应用程序中使用:

public static class MyFeatureFlags
{
    public const string FeatureA = "FeatureA";
    public const string FeatureB = "FeatureB";
}

您可以在操作/方法中使用它来"隐藏"给定流,或者使用它来禁用控制器或单个操作,我相信这就是您的用例:

using Microsoft.FeatureManagement.Mvc;

[FeatureGate(MyFeatureFlags.FeatureB)]
[HttpGet]
public ActionResult<Something> MyApi()
{
    ...
}

如您所见,FeatureB为False,因此操作将被禁用,如果您想要启用它,只需在您的设置中将其值更改为True,API就可以随时使用了.

您可以缓存这些值,以便在您 Select 更改它们时在给定的时间跨度内更新它们:

config.AddAzureAppConfiguration(options =>
    options.Connect(
        builder.Configuration["ConnectionStrings:AppConfig"])
            .UseFeatureFlags(featureFlagOptions => {
                featureFlagOptions.CacheExpirationInterval = TimeSpan.FromMinutes(5);
    }));

之后,您只需更改功能标志的值,并等待缓存刷新您的应用程序设置数据.

请查看此页面以获取参考和更详细的信息,以便您可以在需要时根据您的特定实施调整此答案:

https://learn.microsoft.com/en-us/azure/azure-app-configuration/use-feature-flags-dotnet-core

Csharp相关问答推荐

为什么使用DXGI输出复制和Direct 3D时捕获的图像数据全为零?

Plotly.NET访问互联网时出现异常

C#使用属性和值将JSON转换为XML

EF Core在请求列表时忽略列,但在按ID获取时包含

限制特定REST API不被访问,但部署代码

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

NET8 MAUI并部署到真实设备上进行测试

System.Text.Json .NET 8多形态语法化

如何使用MailKit删除邮箱?

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

为什么@rendermode Interactive Auto不能在.NET 8.0 Blazor中运行?

如何使用EPPlus C#在单个单元格中可视化显示多行文字

KeyDown从我的文本框中删除输入,如何停止?

在平行内使用跨度.用于循环

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

通过mini kube中的远程调试Pod与从emoteProcessPickerScript中解析错误输出的代码错误进行比较

使用Try-Catch-Finally为API端点处理代码--有什么缺点?

如何处理ASP.NET Core中包含两个构造函数的控制器?