ASP.NET中Invisible API多端点及多HTTP方法配置优化问询
问题
在ASP.NET中使用Invisible API库时,需要配置所有API端点,但官方示例仅展示单个端点的配置:
app.UseInvisibleApis(new List<InvisibleApiConfiguration> { new InvisibleApiConfiguration { Endpoint = "/api/home", Header = "Hush", Value = "I'm a good guy", HttpVerb = "GET" } });
实际场景中需要配置大量端点,且同一个端点可能需要支持多种HTTP方法(如GET/POST/PUT/DELETE)。虽然已经编写了创建配置的辅助方法:
private static InvisibleApiConfiguration CreateInvisibleApiConfiguration( string endpoint, string httpVerb, string header, string value) { return new InvisibleApiConfiguration { Endpoint = endpoint, HttpVerb = httpVerb, Header = header, Value = value }; }
但调用时仍需重复编写大量代码,例如同一个/api/Scores端点需要多次调用:
CreateInvisibleApiConfiguration("/api/Scores", "POST", "SecretHeaderScores", "SecretValueScores"), CreateInvisibleApiConfiguration("/api/Scores", "GET", "SecretHeaderScores", "SecretValueScores"), CreateInvisibleApiConfiguration("/api/Scores", "PUT", "SecretHeaderScores", "SecretValueScores"), CreateInvisibleApiConfiguration("/api/Scores", "DELETE", "SecretHeaderScores", "SecretValueScores"),
希望找到更简洁的优化方案。
优化方案
1. 扩展辅助方法,批量生成同一端点的多HTTP方法配置
新增一个接受HTTP方法列表的辅助方法,一次性生成同一个端点的所有方法配置:
private static IEnumerable<InvisibleApiConfiguration> CreateInvisibleApiConfigurations( string endpoint, IEnumerable<string> httpVerbs, string header, string value) { return httpVerbs.Select(verb => new InvisibleApiConfiguration { Endpoint = endpoint, HttpVerb = verb, Header = header, Value = value }); }
调用时只需传入端点、方法列表和凭证信息:
// 定义常用HTTP方法集合 var commonVerbs = new[] { "GET", "POST", "PUT", "DELETE" }; app.UseInvisibleApis(new List<InvisibleApiConfiguration> { // 一次性生成/api/Scores的所有方法配置(C#10+支持集合展开运算符..) ..CreateInvisibleApiConfigurations("/api/Scores", commonVerbs, "SecretHeaderScores", "SecretValueScores"), // 其他端点同理 ..CreateInvisibleApiConfigurations("/api/Users", commonVerbs, "SecretHeaderUsers", "SecretValueUsers"), // 单个方法的端点仍可使用原辅助方法 CreateInvisibleApiConfiguration("/api/Stats", "GET", "SecretHeaderStats", "SecretValueStats") });
2. 用结构化数据集中管理所有端点配置
将所有端点的配置信息集中存储在一个DTO集合中,再批量转换为InvisibleApiConfiguration实例,便于统一维护:
// 定义DTO存储端点基础配置 private record ApiEndpointConfig( string Endpoint, IEnumerable<string> HttpVerbs, string Header, string Value); // 集中管理所有端点的配置规则 var endpointConfigs = new List<ApiEndpointConfig> { new("/api/Scores", new[] { "GET", "POST", "PUT", "DELETE" }, "SecretHeaderScores", "SecretValueScores"), new("/api/Users", new[] { "GET", "POST", "PUT", "DELETE" }, "SecretHeaderUsers", "SecretValueUsers"), new("/api/Stats", new[] { "GET" }, "SecretHeaderStats", "SecretValueStats") }; // 批量转换为Invisible API所需的配置格式 var invisibleConfigs = endpointConfigs .SelectMany(config => config.HttpVerbs.Select(verb => new InvisibleApiConfiguration { Endpoint = config.Endpoint, HttpVerb = verb, Header = config.Header, Value = config.Value })) .ToList(); // 注入配置到中间件 app.UseInvisibleApis(invisibleConfigs);
这种方式的优势在于所有配置集中管理,修改或新增端点时只需调整endpointConfigs集合,无需重复编写实例化代码。
3. 利用全局默认配置(若库支持)
如果Invisible API库支持全局默认的Header/Value配置,可先设置全局默认值,再仅配置差异部分:
// 假设库支持全局配置(需参考官方文档确认) var globalConfig = new InvisibleApiGlobalConfiguration { Header = "DefaultSecretHeader", Value = "DefaultSecretValue" }; app.UseInvisibleApis(globalConfig, new List<InvisibleApiConfiguration> { ..CreateInvisibleApiConfigurations("/api/Scores", commonVerbs), ..CreateInvisibleApiConfigurations("/api/Users", commonVerbs), // 有特殊凭证的端点单独指定 ..CreateInvisibleApiConfigurations("/api/Admin", commonVerbs, "AdminSecretHeader", "AdminSecretValue") });
注:此方案依赖库本身的全局配置支持,若官方文档未提及则无法使用。
内容的提问来源于stack exchange,提问作者Bilol Qobilov
相关产品推荐
相关产品推荐

